KMP 擴充套件KMP

2022-05-07 19:15:10 字數 818 閱讀 3177

本文將不斷加入例題,稍安勿躁,今天的總結爭取9:30寫完.

kmp,中文名字叫字串匹配,用於解決一類字串匹配問題.

先下一些定義:

首先我們先想一想\(nxt_i\)對於求解問題有怎樣的幫助.

我們對於每乙個\(t_i=s_1\)的位置都匹配一次,這樣子複雜度為\(\theta(n*m)\)的.

考慮在暴力匹配中其實我們不一定要重新匹配,因為你畫乙個圖感性理解,發現如果匹配到了\(s\)的\(i\)字首,到\(i+1\)失配,其實是可以從\(nxt_i\)重新開始匹配的.

這個時候\(nxt_i\)的好處就體現出來了,我們可以迅速再一次匹配.

void kmp()

j=0;

for(int i=1;i<=m;i++)

}}

和\(kmp\)沒有半毛錢關係,甚至和\(kmp\)的思想都沒有半毛錢關係.

有兩個字串\(a\),\(b\),要求輸出\(b\)與\(a\)的每乙個字尾的最長公共字首。

還是和往常通過一樣的,從暴力入手。

列舉每乙個\(a\)的字尾然後與\(b\)匹配,複雜度\(\theta(n*m)\)的.

你當然可以\(hash\),但是這與我們討論的東西無關。

我們大致畫一下圖(很重要)發現顯然之前匹配過的位置如果包含這個\(i\)字尾的第乙個字元,那麼可以從那乙個最長匹配開始.

剩下的只需要不斷像\(manacher\)一樣匹配即可.

for(int i=1,l=0,mx=0;t[i];i++)

}

大致就是這樣子了,今天還是有點東西的.

KMP和擴充套件KMP

核心 lena strlen a lenb strlen b next 0 lenb int j 0 re2 i,1,lenb j 0 re i,lena 演算法 設next i 為滿足b i.i z 1 b 0.z 1 的最大的z值 也就是b的自身匹配 設目前next 0.lenb 1 與ex 0...

kmp及擴充套件kmp

kmp匹配主要匹配的是兩個字串,我們將需要匹配的記錄為s1,用於匹配的串為s2.kmp匹配的是從以當前s1中的ch字元為末尾的字串能夠在s2中匹配的最大字首的長度。也即是s1中的每個字首的最長字尾所匹配的s2的最長字首。先考慮自身與自身匹配的情況 如果用dp 數學歸納來思考 假設當前需要匹配j位置的...

KMP和擴充套件KMP

kmp 1 scanf s n s 2 scanf s n t 3int ls strlen s lt strlen t 4 f 0 f 1 0 5 for int i 1 ii 611 int j 0 12 for int i 0 ii 13 kmp的 比較簡單理解了就不會出錯 view code...