1. 程式人生 > >KMP演算法中next陣列的手工計算方法

KMP演算法中next陣列的手工計算方法

筆試題目中經常要求計算KMP演算法的next陣列,網上有很多討論的文章,但是感覺都講的不太清楚,特別是在如何手工計算這一方面,所以今天特別整理了一下放到這裡,一來備忘,二來也希望給有緣人帶來一些方便。

位置編號 1 2 3 4 5 6 7 8
字串 a b a a b a c a
next陣列 0 1 1 2 2 3 4 1

手工計算方法,next陣列從1開始計算
next[1] 肯定是 0
next[2] 肯定是 1

next[n] 的情況,將前面n-1個字元,計算從首尾開始組成最大的相同子串的長度,如果找到,那麼next值是該長度加1,否則next值是1。

舉例
next[7]的計算,字串第七位是c,將前面的6個字元,從頭尾開始取5個組成子串比較,如果不相等,則從首尾取4個字元組成子串進行比較,如下
5個字元的情況:abaab : baaba
4個字元的情況:abaa : aaba
3個字元的情況:aba : aba 此時相等,那麼next[7] = 3+1 = 4
如果一直比較到最後一個字元都不相等,那麼該next值為1

再舉一個例子
next[5]的計算,從前面4個字元中,能得到的所有首尾開始的子串的組合有
aba : baa
ab : aa
a : a 相等,所以next值為1+1 = 2