编程之美----字符串移位包含的问题
题目:给定两个字符串s1和s2,要求判定s2是否能够被s1做循环移位(rotate)得到的字符串包含。例如,给定s1 = AABCD 和 s2 = CDAA, 返回true;给定s1 = ABCD 和 s2 = ACBD, 返回false.
解法一:
对s1循环移位,在进行字符串包含的判断,从而遍历其所有可能性。(程序参考《编程之美》)
解法二:
对解法一分析,可知,对s1循环所得的字符串都是字符串s1s1的子字符串。
所以代码可写成:
1 int substring(const char *scr, const char *des) 2 { 3 int len = strlen(scr); 4 char *s = (char *)malloc(len*2+1); 5 strcpy(s,scr); 6 strcat(s,scr); 7 if(strstr(s, des) != NULL) 8 { 9 return 1; 10 }else 11 { 12 return 0; 13 } 14 free(s); 15 }
该方法利用了“提高空间复杂度来换取时间的复杂度”。
解法三:
结合解法二,可知在和s2进行对比时,对s1循环遍历即可。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 int substring(const char *scr, const char *des) 2 { 3 for(const char *s = strchr(scr, des[0]); s != NULL; s = strchr(s, des[0])) 4 { 5 const char *d = des; 6 while(*s++ == *d++) 7 { 8 if(*s == '\0') 9 s = scr; 10 11 if(*d == '\0') 12 return 1; 13 } 14 } 15 return 0; 16 }