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