KMP算法的next值求解说明

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];
		}
	}

猜你喜欢

转载自blog.csdn.net/jihezhixin/article/details/88019124