问题:
给定两个字符串s1和s2,要求判断s2是否能够被通过s1做循环移位(rotate)得到的字符串包含。例如,S1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false。
三种方法:
void getNext(const char* des, int* next)//KMP算法求next数组
{
int len = strlen(des);
next[0] = -1;
int i = 0, j = -1;
while (i < len)
{
if (j == -1 || des[i] == des[j])
{
i++;
j++;
next[i] = des[i] != des[j] ? j : next[j];
}
else
{
j = next[j];
}
}
}
bool ifContain(const char* src,const char* des)//KMP算法啦~~
{
int len1 = strlen(src);
int len2 = strlen(des);
int* next = new int[len2];
getNext(des, next);
int i = 0, j = 0;
while (i < len1 && j < len2)
{
if (-1==j || src[i] == des[j])
{
i++;
j++;
}
else
{
j = next[j];
}
}
if (j == len2)
return true;
return false;
}
bool rotateContain_1(char* src, char* des)
{
int len = strlen(src);
for (int i = 0; i < len; ++i)
{
char tmp = src[0];
for (int j = 1; j < len; j++)
{
src[j - 1] = src[j];
}
src[len - 1] = tmp;
if (ifContain(src, des))
return true;
}
return false;
}
bool rotateContain_2(char* src, char* des)
{
string srct = src;
srct = src + srct;
if (ifContain(srct.c_str(), des))
return true;
return false;
}
bool rotateContain_3(char* src, char* des)
{
char *p = src, *q = src, *tmp = NULL;
char *r = des;
while (*p != 0)
{
if (*p != *r)
p++;
else
{
tmp = p;
tmp++;
while (*r++ == *p++)
{
if (*p == 0)
p = q;
if (*r == 0)
return true;
}
r = des;
p = *tmp == 0 ? q : tmp;
}
}
return false;
}
void main()
{
char src[] = "AACDBCD";
char des[] = "CDAA";
cout << rotateContain_1(src, des) << endl;
cout << rotateContain_2(src, des) << endl;
cout << rotateContain_3(src, des) << endl;
}
参考:
http://www.cnblogs.com/sooner/p/3270548.html