题目:给定两个字符串s1和s2,要求判断s2是否能通过s1做循环移位得到的字符串包含。
例如:给定s1=AABCD和s2=CDAA,返回true;给定s1=ABCD和s2=ACBD,返回false。
题目本质是判断s2是否包含在s1s1中,这里用KMP算法求解
#include <iostream>
using namespace std ;
void GetNext(char *p, int next[])
{
int len = strlen(p);
next[0]=-1;
int i=0,k=-1;
while(i<len-1)//此处注意,第15行会i++操作,所以循环终止在len-1
{
if (k==-1 || p[i]==p[k])
{
i++;
k++;
next[i]=k;
}
else
{
k=next[k];
}
}
}
int KMP_Match(char *source, char *pattern)
{
int s = strlen(source);
int t = strlen(pattern);
int *next = new int[t];
GetNext(pattern,next);
int i=0,j=0;
while(i<s && j<t)
{
if (j==-1 || source[i]==pattern[j])
{
i++;
j++;
}
else
{
j=next[j];
}
}
return (j==t)?i-j:-1;
}
int main()
{
char *s = "ababcababa";
char *p = "ababa";
int st = KMP_Match(s,p);
cout << st;
cout<<endl;
system("pause");
return 0;
}
详细分析可以参考《算法导论》32.4节。
以上代码参考了
http://www.juliuschen.com/archives/21.html
http://www.cnblogs.com/dolphin0520/archive/2011/08/24/2151846.html