kmp演算法戳這裡->kmp演算法精簡說明變數i:用於遍歷next陣列下標給一一賦值;這裡我們學習next陣列是如何通過**實現一一取值的。
變數j:用於指向上一段的最長公共字首的下一位。
例如:當我們在算「abad」的next值時, 前一段就是」aba「,此時j指向的就是b。
①下標i項與下標j項比較;
相等,那直接j移到下一位,相同前字尾就是(j++)的值;
不相等,j需要回溯:
回溯我們令檢視下標j-1的next陣列值,發現為1;令j=next[j-1];
原本的j指向的是前一次相同前字尾的最長串,所以字首的0-2和字尾的4-6是一樣的;
回溯,要找到0-2中的字首和4-6中的字尾相等,所以就是next[j-1]的值;這樣再判斷0-2中字首的下一位和4-6中的字尾的下一位(當前的i)是否相等,不相等則繼續回溯;
設定j>0,因為j==0時,就是第乙個了,不能再往前回溯,只需比較這乙個就行了,不相等就為0(不進行j++).
public
int[
]getnext
( string moshi )
if( moshi.
charat
(i)== moshi.
charat
(j)) j++
; next[i]
= j;
}return next;
}
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陣列的演算法給優化得已經很無解了,以至於至今我...
KMP演算法的next陣列
本文參考 google 資料結構 c語言 include include author silence time 2012 5 19 description kmp演算法的next using namespace std void next char t,int l,int next else 1 ...