KMP算法中的next数组定义如下:
举个例子说明一下:
假设有字符串 abaabcac
p1 | p2 | p3 | p4 | p5 | p6 | p7 | p8 |
---|---|---|---|---|---|---|---|
a | b | a | a | b | c | a | c |
根据定义,模式串的前两个字符的next值为0、1,则 next[1] = 0 ; next[2] = 1 ;
next[3]的值: 看前两个字符组成的字符串 ab ,p1!=p2,所以属于定义的其他情况,所以next[3]=1
next[4]的值: 看前三个字符组成的字符串 aba ,p1=p3, 即k=1+1=2,所以next[4]=2
next[5]的值: 看前三个字符组成的字符串 abaa ,p1=p4, 即k=1+1=2,所以next[5]=2
next[6]的值: 看前三个字符组成的字符串 abaab ,p1p2=p4p5, 即k=2+1=3,所以next[6]=3
next[7]的值: 看前三个字符组成的字符串 abaabc ,p1!=p6,所以属于定义的其他情况,所以next[7]=1
next[8]的值: 看前三个字符组成的字符串 abaabca ,p1=p7, 即k=1+1=2,所以next[8]=2
所以模式串的next值为 01122312。
接下来看一下c代码实现
void getNext(String T , int next[] )
{
int i=1;
next[1]=0;
int j=0;
while( i<T[0] )
{
if( j==0|| T[i]==T[j] )
{
++i;
++j;
next[i]=j;
}
else
{
j=next[j];
}
}