KMP算法关键是构造next数组。其主要思想是寻找前缀串和后缀串的相等的最大长度。
当next[j]=k时,p(0)...p(k-1)=p(j-k)...p(j-1)
对于next[j+1]有两种情况:
A. p(k)=p(j), 则next[j+1] = k+1
B. p(k)!=p(j), 则令k=next[k]继续匹配,直到next[k]=-1;
#include<iostream>
using namespace std;
void get_next(string p, int *next)
{
int j = 0;
int k = -1;
int len = p.length();
next[0] = -1;
while (j < len-1)
{
if (k==-1 || p[k]==p[j])
{
j++;
k++;
next[j] = k;
}
else
k = next[k];
}
}
int index_KMP(string S, string T, int pos)
{
int i = pos;
int j = 0;
int next[100];
get_next(T, next);
int lenS = S.length();
int lenT = T.length();
while (i<lenS && j<lenT)
{
if (j==-1 || S[i]==T[j])
{
i++;
j++;
}
else
j = next[j];
}
if (j >= lenT)
return i-lenT;
return -1;
}
int main()
{
string s = "ababcababa";
string t = "ababa";
int pos = index_KMP(s, t, 0);
cout<<pos;
return 0;
}