KMP和擴充套件KMP

2022-01-29 17:25:04 字數 1238 閱讀 1860

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

擴充套件kmp:

1     scanf("

%s\n

",s);

2 scanf("

%s\n

",t);

3int ls=strlen(s),lt=strlen(t);

4 next[0]=lt;

5 next[1]=lt-1;//

第乙個注意點:對自己匹配的時候是要從第1個位置開始暴力,而不是第0個

6for(int i=0;i1;++i)

7if(t[i]!=t[i+1])8

12int k=1;13

for(int i=2;ii)

1425

}26 ex[0]=lt;//

兩個串匹配則是從第0個位置開始暴力

27for(int i=0;ii)

28if(s[i]!=t[i])

2933 k=0;34

for(int i=1;ii)

3546 }

view code

這裡來手推一下擴充套件kmp:

設p表示s到達的最遠點,而p是由k更新到的,故p=k+ex[k]-1

故s[k..p]==t[0..p-k]

我們要求的是ex[i],所以要找出s[i]開頭的一些關係,又注意到i>k,故s[i..p]==t[i-k..p-k]

而又想到應該是s[i..p]==t[0..?],因為匹配的是從0開始的,所以就涉及到了t[i-k..?]和t[0..?]的自身匹配,故引進next[i-k]表示t和t自己匹配(與ex一樣,只不過ex儲存的是兩個字串的匹配),設其為l,則有t[i-k..i-k+l-1]==t[0..l-1]

這裡考慮:①i-k+l-1②i-k+l-1>=p-k,這就說明s[i..p]==t[0..p-i],那麼接下來就從s[p+1]和t[p-i+1]開始暴力判斷,並維護k和p

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

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

kmp及擴充套件kmp

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