题目描述: 给定两个字符串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;
}
转载请注明本文出处:
本文章为转载内容,我们尊重原作者对文章享有的著作权。如有内容错误或侵权问题,欢迎原作者联系我们进行内容更正或删除文章。