kmp及擴充套件kmp

2021-08-21 16:15:28 字數 616 閱讀 3509

kmp匹配主要匹配的是兩個字串,我們將需要匹配的記錄為s1,用於匹配的串為s2.

kmp匹配的是從以當前s1中的ch字元為末尾的字串能夠在s2中匹配的最大字首的長度。

也即是s1中的每個字首的最長字尾所匹配的s2的最長字首。

先考慮自身與自身匹配的情況:

如果用dp+數學歸納來思考:

假設當前需要匹配j位置的字元,從0—j-1位置都已經記錄了該位置能夠匹配到的自身字串的真最大字首長度,用next陣列記錄了該長度。

首先要獲取next[j-1]的大小,表示不考慮j位置字元的匹配長度,現在再加入字元時,需要檢視next[j-1]+1位置的字元s2[next[j-1]+1]==s2[j],如果想等,則由定義可知,next[j]=next[j-1]+1,即長度比j-1位置的長度大1。如果不相等,我們應該去尋找0—next[j-1],這一段字串中以j-1位置字元為末尾的最長匹配長度,其實就是和尋找j一樣的過程,是個遞迴。也即是next[next[j-1]],去檢視是否和s2[j]相同,不然繼續向下處理。

int next[maxn]; //指向的是座標 不是長度,因此沒有匹配為-1

void getnext(char *s)

}}

KMP 擴充套件KMP

本文將不斷加入例題,稍安勿躁,今天的總結爭取9 30寫完.kmp,中文名字叫字串匹配,用於解決一類字串匹配問題.先下一些定義 首先我們先想一想 nxt i 對於求解問題有怎樣的幫助.我們對於每乙個 t i s 1 的位置都匹配一次,這樣子複雜度為 theta n m 的.考慮在暴力匹配中其實我們不一...

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 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...