字符串移位包含的问题--编程之美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;
}

posted on 2011-04-06 13:46  tzc_yujunyong  阅读(281)  评论(0)    收藏  举报