字符串移位包含问题(KMP)

来源:互联网 发布:python 2.7支持中文吗 编辑:程序博客网 时间:2024/06/06 03:01

题目:给定两个字符串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

原创粉丝点击