KMP演算法略解

2022-02-09 00:04:01 字數 1189 閱讀 8921

前言

本文是我對kmp演算法的臨時理解, 用於使我不懷疑kmp演算法的正確性,用著放心。

如圖(1), 長串與短串進行匹配暴力對齊匹配時,在紅叉號處失配, 長串的子串藍串和短串的字首黃串相等。

如圖(2), 試圖利用已有資訊(黃串等於藍串), 來快速尋找短串串頭下一次應該對齊長串的哪個位置, 這個位置被描述為「下乙個可能會在那匹配成功的位置」

如圖(3), 假設自前日敗北後,找到了第乙個使得綠線劃分出的藍串與黃串的兩部分相等的位置。

由於沒有長串在綠線右邊的資訊, 所以此時無法斷定此位置的匹配是否會成功, 即此位置就是要找的「下乙個可能會在那匹配成功的位置」

顯然, 如果綠線劃分出的黃串與藍串不全相等, 那麼此位置一定會失配。

如圖(4), 綠線的印記留在黃串與藍串上, 對齊黃串與藍串,觀察。

發現只要找出黃串的字尾等於字首的最長長度(值得注意的是, 這裡的最長長度不應等於黃串的串長)即可以找到所謂「下乙個可能會在那匹配成功的位置」

\[今天的我是最強噠! by\;某萊伊or某路易or某魯伊

\]看圖, 只可意會, 不可言傳qwq(lazy boy)

luogu板子題ac**

#includeusing namespace std;

const int maxn = 1e6+15;

char s1[maxn], s2[maxn];

int len1, len2;

int nxt[maxn], f[maxn];

int main()

for(int i=1,j=0;i<=len1;++i)

for(int i=1;i<=len1;++i) if(f[i]==len2) cout<

for(int i=1;i<=len2;++i) cout<

return 0;

}

KMP演算法模板(草解)

在長度為n的字串中匹配長度為m的字串,kmp演算法是在任何的字串中匹配中時間複雜度都是o m n 不會出現極致的情況o n m 簡單得講他就是先對字串n進行預處理,從而在與字串m匹配時跳過一些字串,從而達到快速匹配的目的 他是怎麼實現的呢?假設指標i指向字串n,j指向字串m的位置,在使用kmp演算法...

kmp演算法 next陣列解

kmp演算法 小白式學法 不需要指標回溯,並實現自由的主串,先直接上 具體演算法過程 1 next陣列的求法主要在模式串的分析,分析如下 當模式串字元與主串字元不匹配時,我們平時的暴力解法是直接回溯主串的指標到初始位置,但是我們現在可以想利用我們主串和模式串已經匹配過的位置,通過模式串的部分匹配我們...

RPAD函式略解

在寫本篇部落格之前,有一點小東西要寫在前面,漢字佔多少個位元組得看你用的是什麼編碼集,如果是gbk和gb2312的話,確實是兩個位元組,在windows平台上會是你預期的兩個位元組。但是在linux平台使用的是utf8字符集,那麼就不一定了,不過,我現在做plsql等東西一般是在win平台上做的,l...