首先定義乙個概念:
字串:不定義了。
字首pre(i):s[1...i]。字尾記為suf(i):s[i...1]。
子串:略。
border:如果在字串s中,存在乙個字首等於它的字尾,就稱這個字首是這個字串的乙個border。
(ps:不允許選擇整個串)
顯然乙個字串可能有若干個border。
記乙個字串中的最長的border為lborder。
特別的,我們把s的乙個字首的lborder記為lborder(i)
考慮怎麼計算每個字首的lborder。
首先,lborder(1)=0。這是廢話。
然後假設我們已經把1~(i-1)的lborder算出來了。
考慮現在計算lborder(i),假設第i個字元是c。
然後考慮,如果lborder(i)>0,那麼把字元c去掉後,一定是i-1的乙個border。
因此我們可以列舉i-1的所有border,找到其中最長的乙個滿足其後面的字元為c的border。
如何找到i-1的所有border呢?
我們注意到,串s的border,要麼是lborder,要麼是lborder的乙個border。
因此每次令j=border(j)就可以列舉到所有的border。
kmp演算法next例題 KMP演算法next陣列求解
kmp演算法與bf演算法的比較 bf演算法的想法十分樸素,即先將子串t的第一位與主串s的第一位對齊開始匹配,當不能匹配時將子串整體往後移一位,然後重新匹配,以此類推直至排出結果 如當遇到下圖所示情況時,需將子串整體後移一位,將i,j分別回溯到主串第2位和子串第一位。kmp演算法 對bf進行思考後,我...
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陣列的演算法給優化得已經很無解了,以至於至今我...