(来自《编程之美》)
给定两个字符串s1和s2,要求判断s2是否能够被s1做循环移位(rotate)得到的字符串包含。
我的解法(想法比较复杂):
1 #include<iostream> 2 using namespace std; 3 bool isCover(string s1, string s2){ 4 int len1, len2; 5 len1 = s1.length();len2 = s2.length(); 6 if(len1 == 0 || len2 == 0 || len2>len1) 7 return false; 8 int startIndex = 0; 9 while(s1[startIndex] != s2[0]){ 10 startIndex ++; 11 if(startIndex >= len1 || startIndex >= len2)//reach the tail of s1 12 return false; 13 } 14 int index1,index2; 15 index1 = startIndex; 16 for(index2 = 0; index2<len2; ){ 17 if(s2[index2] != s1[index1]) 18 return false; 19 20 else{ 21 index1++; 22 index2++; 23 } 24 if(index1 == len1) 25 index1 = 0; 26 } 27 if(index2 == len2) 28 return true; 29 30 } 31 int main(){ 32 string str1 = "AABCD"; 33 string str2 = "CADD"; 34 string str3 = "AABCD"; 35 string str4 = "CDAA"; 36 cout<<isCover(str1, str2)<<endl; 37 cout<<isCover(str3, str4)<<endl; 38 return 0; 39 }
输出:
第一组输出false,第二组输出true
书上的解法比较简单,就是把问题简化成考察str2是否在str1str1中就行了。代码如下,两个函数分别是c风格和c++风格的:
1 bool isCover1(char *src, char *des) 2 { 3 int srcLen = strlen(src); 4 char *double_src = strcat(src,src); 5 //返回des在double_src中第一次出现位置的指针,如果没有找到返回NULL 6 if(strstr(double_src, des) != NULL) 7 cout<<true<<endl; 8 else 9 cout<<false<<endl; 10 } 11 bool isCover2(string src, string des) 12 { 13 string double_src = src+src; 14 if(double_src.find(des) < double_src.length()) 15 return true; 16 else 17 return false; 18 }