KMP 演算法 next 陣列理解

2021-10-23 19:46:38 字數 902 閱讀 7577

可以先看一下阮一峰老師的日誌,kpm演算法(阮一峰日誌)。

kpm演算法有一步是求next陣列,next[i]表示字串s[0...i]中最大相同前字尾的索引。

比如字串abcdab,整個字串的最大相同前字尾相是ab,那麼next[5]=1。

function next($s) 

if($s[$i] == $s[$j + 1])

}return substr($s, 0, $next[strlen($s) - 1] + 1);

}

1.從第2個字元開始迴圈計算索引到i個字元時,next[i]的值

2.如果當前字元等於已知相同字首的下一位,則當前最大字首索引next[i]等於j+1

3.如果當前字元不等於當前最大相同字首的下一位,則使用字串s[0...j]的最大相同字首,即next[j]。(比較s[i]和s[next[j]+1]是因為,這樣可以之前比較出來的最大相同字首,這塊是關鍵,也是最不容易理解的地方)。

4.最後取出整個字串的最大字首索引,然後截取出字首字串。

示例:

此時,next[i-1] = 6。

1.如果s[i]==s[j+1];那麼字串s[0...i]重複的字首長度將在next[i-1]基礎上加1;

2.如果s[i]!=s[j+1],則知道next[i-1]=6,next[6] = 2(到綠色箭頭位置的字串,重複字首有3個字元,索引到2);

可以理解為將字串開頭的abc後的x字元和當前的問號『?』比較,因為這是目前可以出現最長重複字首的做法。

KMP演算法 next陣列的理解

最近在學習資料結構,學到了kmp演算法。起初只知道kmp演算法的目的,就是讓模式串向右滑動盡可能遠的距離,也理解演算法的目的。但是對其中next陣列的含義和求解,還是不太清楚。經過一番思考,恍然大明白,在這裡記錄分享一下。首先貼乙個我認為比較好理解的說明 如何更好的理解和掌握 kmp 演算法 kmp...

KMP演算法 next陣列

通過上文完全可以對kmp演算法的原理有個清晰的了解,那麼下一步就是程式設計實現了,其中最重要的就是如何根據待匹配的模版字串求出對應每一位的最大相同前字尾的長度。我先給出我的 1 void makenext const char p,int next 214 next q k 15 16 現在我著重講...

KMP演算法 NEXT陣列

kmp和next陣列基本上是一起用的,有了next陣列,才有kmp演算法,講道理來說這兩個都是基於最大前字尾和,也就是說需要用到kmp的時候必須先把next陣列先求出來,next陣列就是由所匹配的word的每個子串的前字尾和最大匹配得到的,說實話next陣列的演算法給優化得已經很無解了,以至於至今我...