主串 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]大功告成啦!