通过分析子串,得到当前不匹配时,应该回跳到的位置——next数组。
#include<cstring>
void getnext(char* b,int next[])
{
int i=0,j=-1;
next[0]=-1;
while(b[i]){
if(j==-1||b[i]==b[j])next[++i]=++j;
else j=next[j];
}
}
int kmp(char* a,char *b,int next[])
{
int len1=strlen(a),len2=strlen(b);
int i=0,j=0;
while(i<len1&&j<len2){
if(j==-1||a[i]==b[j]){ i++;j++; }
else j=next[j];
}
if(j>=len2)return i-len2;
return -1;
}