字符串移位包含的问题--编程之美3.1
假设字符串s1=AABCD,s2=CDAA,判断s2是否可以通过S1的循环移位得到字符串包含。
如 s1移两位: 1.ABCDA->2.BCDAA 则此时包含了 S2="CDAA"
s1的长度应该是大于s2的长度
解题思路:
分解s1的循环移位得到:
AABCD, ABCDA, BCDAA, CDAAB,.....
如果我们将前面移走的字符串保留下来,则有:
AABCD, AABCDA, AABCDAA, AABCDAAB, AABCDAABC, AABCDAABCD
这里,我们可以发现,实际对s1的循环移位得到的字符串实际为s1s1。
那么我们判断s2是否可以通过s1循环移位得到包含,则只需要判断s1s1中是否含有s2即可以。
用提高空间复杂度来换取时间复杂度的减低的目的。
代码如下:
View Code
bool contain(char *str1, char *str2)
{
char tmp[MAXN];
strcpy(tmp,str1);
strcat(str1,tmp);
if (strstr(str1,str2)==NULL) return false;
return true;
}

浙公网安备 33010602011771号