给定两个字符串s1和s2,要求判断s2是否能够被s1做循环移位得到的字符串包含。例如,给定s1=AABCD和s2=CDAA,返回true;给定s1=ABCD,s2=ACBD,返回false。
思路:最直接的方法是循环移位s1,遍历s1并判断是否包含s2。但这种方法效率不高。经书本提示,问题可转换为判断s1+s1是否包含s2,从而解决循环移位所需的时间。
1 bool rotate(char *str,char *des){ 2 int len = strlen(str)*2; 3 char *result = new char(len); 4 5 strcpy(result,str); 6 strcat(result,str); 7 8 for(int i=0;i<len;i++){ 9 cout<<result[i]<<endl; 10 } 11 12 if(strstr(result,des)){ 13 return true; 14 } 15 16 return false; 17 18 } 19 20 int _tmain(int argc, _TCHAR* argv[]) 21 { 22 char str[6] = "AABCD"; 23 char des[5] = "CDAA"; 24 rotate(str,des); 25 }
此问题虽难度不大,但可以引出下列知识点:
KMP匹配
字符串相似度问题
strstr()函数源码