(原創)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]大功告成啦!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章