1.核心代码
class Kmp { public : string s; string t; int next[maxn]; void get_next() { int i=-1,j=0,lent=t.size(); next[j]=-1; while(j<lent-1) { if(i==-1||t[i]==t[j]) next[++j]=++i; else i=next[i]; } } int kmp() { int i=0,j=0,lens=s.length(),lent=t.size(); get_next(); while(i<lens&&j<lent) { if(j==-1||t[j]==s[i]) { i++; j++; } else j=next[j]; } if(j==lent) return i-j+1; else return 0; } };
2.完整代码+例题
a.地址:http://tk.hustoj.com/problem.php?id=1746
b.代码
#include<iostream> #include<string> using namespace std; const int maxn=100; class Kmp { public : string s; string t; int next[maxn]; void get_next() { int i=-1,j=0,lent=t.size(); next[j]=-1; while(j<lent-1) { if(i==-1||t[i]==t[j]) next[++j]=++i; else i=next[i]; } } int kmp() { int i=0,j=0,lens=s.length(),lent=t.size();/*请注意这不是多余的,这不是多余的,这不是多余的*/ get_next(); while(i<lens&&j<lent)//直接用j<t.size()会出现-1<t.size()为false情况 { if(j==-1||t[j]==s[i]) { i++; j++; } else j=next[j]; } if(j==lent) return i-j+1; else return 0; } }; int main() { Kmp a; while(cin>>a.s>>a.t) cout<<a.kmp()<<endl; return 0; }
3.KMP改进算法
#include<iostream> #include<string> using namespace std; class String { string s; string t; public: void get_nextval(int nextval[]) { int k=-1; int j=0; nextval[0]=-1; while(j<(int)t.size()) { if(k==-1||t[k]==t[j]) { k++; j++; if(t[k]!=t[j]) nextval[j]=k; else nextval[j]=nextval[k]; } else k=nextval[k]; } } int kmp_indexl()//改进KMP { int *nextval=new int[(int)t.size()+1]; get_nextval(nextval); int i=0,j=0; while(i<(int)s.size()&&j<(int)t.size()) { if(j==-1||s[i]==t[j]) { i++; j++; } else j=nextval[j]; } delete []nextval; if(j>=(int)t.size()) return i-t.size()+1; else return 0; } friend int main(); } ; int main() { String a; while(cin>>a.s>>a.t) cout<<a.kmp_indexl()<<endl; return 0; }