KMP演算法中next陣列解析

2021-08-31 09:37:33 字數 1581 閱讀 2023

接上篇:

next 陣列 主要記錄 子串 的 每乙個字首(按順序)的 最長匹配真前字尾 的長度。

這裡講一下 求解原理。

陣列從零開始,第乙個數 「-1」 ,代表不存在;(有的以 「0」,為起點代表空,這不矛盾,全加1 ,即為此格式)

此陣列是一點點增長的,下乙個資料依賴之前的資料。

舉例子來描述原理:

當新的最後乙個字母過來,和上乙個字串的 最長匹配真前字尾 的字首後一位相同,則在陣列對應位置,記錄上的數是上乙個 最長匹配真前字尾 長度 +1 ;即next陣列前乙個位置next[j] +1.  (新出現乙個數,最長匹配真前字尾 的長度 最多 +1 ,對吧。下面會用到)

.如果新過來的字元和下乙個位置不相符,如何處理?

新出現乙個數,最長匹配真前字尾 的長度 最多 +1

那一定就是要把下面的串右移!!!即最長匹配真前字尾 的長度會減少!!

怎麼移呢? 從頭乙個乙個匹配? 可以,但並不優秀。

之前next陣列中記錄的資料,是不是可以用起來呢?

我們求的是匹配長度最大值,可以從可能的最大值依次往下驗證,成立即為新的最大。

劃重點啦!!!    可能的最大值是什麼呢?

就是從次級最長匹配真前字尾的下一位 匹配啊!!!

舉個例子: 子串  s =  "abcdabceabcdabc" ;  新字元 為'd'; 示例如下:

'd' 和 'e' 失配後,存在可能性的就是次級最長匹配真前字尾且長度從大到小排列的,就是 圖中的s4 !

此時只需要把 : 『d』  和次級最長匹配真前字尾s4 後面的字元比較就可以了!

如果相同 執行步驟一,如果不相同執行步驟二。

次級最長匹配真前字尾是 字串s 的第二長的匹配真前字尾,同時也是最長匹配真前字尾 (s3)最長匹配真前字尾。

在此處,各位看官怎麼理解都可以。不過似乎 理解為 ,最長匹配真前字尾 (s3)最長匹配真前字尾 (-->s4),方便一些。便於理解這個**中的迴圈處理。

void cal_next(char *str, int *next, int len)

if (str[k + 1] == str[q])//如果相同,k++

next[q] = k;//這個是把算的k的值(就是相同的最大字首和最大字尾長)賦給next[q]

cout

kmp演算法的next陣列解析

昨天天殺的 做了個字串匹配的題,於是天殺的 重新學習 kmp演算法 實際上第一次學的時候就沒搞懂 首先搞清楚幾個概念 什麼是字串匹配?比如給定字串 aabcaa 想要知道 abca 是否存在於該字串中,這個過程就是字串匹配。類似於string.indexof 什麼是kmp演算法?如果暴力破解,abc...

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陣列的演算法給優化得已經很無解了,以至於至今我...