现在的位置: 首页 > 综合 > 正文

字符串移位包含问题

2012年07月23日 ⁄ 综合 ⁄ 共 1303字 ⁄ 字号 评论关闭
题目描述: 给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得 到的字符串包含。
例如,给定s1=AABCD和s2=CDAA,返回true, 给定s1=ABCD和s2=ACBD,返回false 
分析:
方法一:直接进行循环移位判断是否包含des
bool srcContaindst1(char src[],char des[])
{
	if(*src==NULL||*des==NULL||strlen(src)==0||strlen(des)==0||strlen(src)<strlen(des))
		return false;
    int srclen=strlen(src);
    for(int i=0;i<srclen;i++)
    {
        char firstChar=src[0];
        for(int j=0;j<srclen-1;j++)
        {
            src[j]=src[j+1];
        }
        src[srclen-1]=firstChar;
        if(strstr(src,des)!=NULL)
        {
            return true;
        }
    }
    return false;
}

方法二:如果把前面移走的数据进行保留,会发现src自循环一周形成新的字符串,如AABBCD自循环一周后为ABBCDAABBCD,它包含了CDAA。如果包含目标字符串des,即找到满足条件的字符串 

bool srcContaindst2(char src[],char des[])
{
	if(*src==NULL||*des==NULL||strlen(src)==0||strlen(des)==0||strlen(src)<strlen(des))
		return false;
    int len=strlen(src);
    char *newSrc=new char[len*2+1];
    for(int i=0;i<len*2;i++)
    {
        if(i<len)
            newSrc[i]=src[i];
        else
            newSrc[i]=src[i-len];
    }
    newSrc[len*2]='\0';
    if(strstr(newSrc,des)!=NULL)
    {
        return true;
    }
    return false;
}

方法三:有没有一种方法:不需要申请过多新空间,而同样解决这一问题?采用src字符串指针循环的方法访问的方法

bool srcContaindst3(char *src,char *des)
{
	if(*src==NULL||*des==NULL||strlen(src)==0||strlen(des)==0||strlen(src)<strlen(des))
		return false;
	char *head=src;
	char *c_s=src,*c_d=des;
	while(*src!='\0'){
		if(*src==*des){
			c_s=src;
			c_d=des;		
			while(*c_s==*c_d){
				c_s++;
				c_d++;
				if(*c_s=='\0')
					c_s=head;
				if(*c_d=='\0'){
					return true;
				}
			}
		}
		src++;
	}    
    return false;
}

转载请注明本文出处: http://blog.csdn.net/love254443233

 

抱歉!评论已关闭.