next[i]=j:若第i位的发生错误,跳转到第j位去匹配。也就是模式串1~j-1位与i-j+1~i-1位相同。
#include<bits/stdc++.h>
using namespace std;
void get_next(string T, int next[]){
int i=1, j=0;
next[1]=0;
while(i<T.length()){
if(j==0||T[i]==T[j]){
//1~i位与j-i+1~j位相同
//第j+1错误,就可以之间跳转到第i+1位
++i;++j;
next[i]=j;
}
else{
//如果i与j不同,匹配不上,j就往前找,一直找到能匹配上
j=next[j];
}
}
}
int kmp(string s, string T) {
int i=1,j=1;
int next[100000];
get_next(T, next);
while(i<=s.length()&&j<=T.length()){
if(j==0||s[i]==T[j]){
++i;
++j;
}
else{
j=next[j];
}
}
if(j>T.length()){
return i-T.length();
}
else return 0;
}
int main (){
string s="ababaa";
int h=kmp(s, "baa");
cout<<h<<endl;
return 0;
}