KMP算法的next数组求解步骤

主串 s="AABBCBBABBCACCD"

模式串 t="BBABBCAC"

  • 第一步:求解出初步的next数组

(1)固定前两个 next[0]=-1,next[1]=0 

(2)从模式串t[2]开始,这里是'A',倒序往前面看,如这里第二个‘B’,这个‘B’为它的长度为1的子串,看到第一个字母为止。比较这些子串与第一个字母开始的子串有没有匹配的,如这里的长度为1的子串与第一个字母t[0]刚好匹配,即ok,有next[2]=1  (1就是这个匹配串的长度,是不是很简单)。

(3)与(2)同理,来到t[3],这里是'B',前面子串(注意是倒序)有'A','BA',可见没有与从头开始数的串相匹配的,故next[3]=0。

(4)依次下去得到初步的next数组[-1,0,1,0,1,2,0,0]

  • 第二步:更新next数组

更新next数组很关键,具体原因大家可以看看其他讲原理比较多的博客。

具体做法:j为next数组的下标,k为得到的next数组值。

当t[j]=t[k]时,更新next数组的值为-1。

for example:

                  next[0]=-1  ..省略

                  next[1]=0    //t[1]==t[0]?更新next[1]=-1:不做更改

                  next[2]=1    //t[2]==t[1]?更新next[2]=-1:不做更改

                  next[3]=0    //t[3]==t[0]?更新next[3]=-1

                  next[4]=1    //t[4]==t[1]?更新next[4]=-1

                  next[5]=2    //t[5]==t[2]?更新next[5]=-1:不做更改

                  next[6]=0    //不做更改

                  next[7]=0    //不做更改

所以最后得到的next数组就是[-1,-1,1,-1,-1,2,0,0]大功告成啦!

猜你喜欢

转载自blog.csdn.net/Toky_min/article/details/87971457