题目描述: 给定两个字符串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