KMP演算法入門 保證你會

2021-08-18 12:27:36 字數 1314 閱讀 3911

下面開始簡單講解一下:

模式串pattern=「abaabcac」——我們該如何求它的next陣列呢?為了方便理解,我們陣列下標從1開始

相信你從網上其他很多資料對next陣列已經有一定的了解了,那麼我們直接上乾貨:

首先,我們規定:next[1]=0,next[2]=1。即next第一位為0,next第二位為1。

每次比較 設當前位為 i,那麼,我們通過比較i-1位上的字元與其next[i-1]對應的字元是否相等,如果相等,那麼next[i]=next[i-1]+1,即當前next的值加一。

如果與前一位相比較,發現不等,那麼 我們繼續向前尋找 即 i-1-1,重複上述2 步驟。但是請注意:我們比較的字元始終是i位置的前乙個與我們尋找的不斷向前的字元相比較(唔,好吧說的很拗口。看看例子)。

如果一直尋找到第乙個位置上的字元,那麼 i的next值就為1。

舉個例子:

我們求模式串第四位 a的next,

先找到第三位的 a,和他的next[3],next[3]的值為1,那麼就去模式串的第一位字元(pattern.indexof(next[3]-1))與 a 相比較(即a==?a),此時發現相等那麼next[4]=next[3]+1

我們假設不等於,

此時 我們將向前尋找,找到第二位的bnext[2]的值為1,那麼此時就該比較 (注意這個a始終是第三位的,即第四位前面一位)a==?a(pattern.indexof(next[2]-1)),

我們假設仍舊不等,那麼繼續向前,來到了第一位a,那麼直接將next[4]的值賦為1即可

next的求法就是這個,相信你多看幾次就能夠理解了。

integer getnext(string pattern) 

if(pattern.charat(pre)==pattern.charat(next[index]-1))

else }}

return

next;

}

關於next的使用就相對簡單了,可以參考下面這篇部落格:

kmp

KMP演算法入門

kmp演算法的核心,是乙個被稱為部分匹配表 partial match table 的陣列。我覺得理解kmp的最大障礙就是很多人在看了很多關於kmp的文章之後,仍然搞不懂pmt中的值代表了什麼意思。這裡我們拋開所有的枝枝蔓蔓,先來解釋一下這個資料到底是什麼。對於字串 abababca 它的pmt如下...

KMP演算法入門講解

字串匹配問題。假設文字是乙個長度為 n 的字串 t 模板是乙個長度為 m 的字串 p 且 m leq n 需要求出模板在文字中的所有匹配點 i 即滿足 t i p 0 t i 1 p 1 t m 1 p m 1 的非負整數 i 注意字串下標從0開始 如圖所示,p 在 t 中有且只有乙個匹配點,即位置...

演算法學習 KMP入門

如何進行匹配 kmp解決的是模式串 s s 和文字串 t role presentation t t之間的匹配問題。傳統和暴力演算法,在複雜度方面不夠優秀,根本原因在於對模式串沒有的規律沒有加以利用,導致進行了多餘的匹配。而kmp演算法的關鍵也在於ne xtn ex t陣列,求解出了模式串ne xt...