擴充套件KMP演算法 Extend KMP

2022-10-03 23:12:23 字數 777 閱讀 8693

擴充套件kmp既是求模式串和主串的每乙個字尾的最長公共字首

即令s[i]表示主串中以第i個位置為起始的字尾,則b[i]表示s[i]和模式串的最長公共字首

顯然kmp是求s[i]=模式串長度的情況,所以,擴充套件kmp是對kmp的拓展

像求kmp的next陣列一樣,我們先求a[i],表示模式串的字尾和模式串的最長公共字首

然後再利用a[i]求出b[i]

說明一下a的求法,b同理

現在我們要求a[i],且a[1]---a[i-1]已經求出,設k,且1<=k<=i-1,並滿足k+a[k]最大

所以t[k]--t[k+a[k]-1]=t[0]--t[a[k]-1],推出t[i]--t[k+a[k]-1]=t[i-k]--t[a[k]-1]

令l=a[i-k],若l+i-1

並相應更新k

時間複雜度為線性o(m+n)

while(1+j

j = j + 1;

a[1]=j;

int k=1;

for(int i=2; i

&nbs程式設計客棧p;

}j = 0;

while(j

j = j + 1;

b[0] = j,k = 0;

for(int i=1; i

}&n程式設計客棧bsp;ps:普通的next是到這個結尾的,能和模式串匹配的長度,擴充套件kmp是以這個開頭的能匹配的最大長度

pss:然後我簡單比較了下kmp和擴充套件kmp

本文標題: 擴充套件kmp演算法(extend kmp)

本文位址:

擴充套件KMP演算法

擴充套件kmp 求出a i.lena 1 與b的最長公共字首長度,記為ex i 或者說,ex i 為滿足a i.i z 1 b 0.z 1 的最大的z值 擴充套件kmp可以用來解決很多字串問題,如求乙個字串的最長回文子串和最長重複子串。演算法 設next i 為滿足b i.i z 1 b 0.z 1...

擴充套件KMP演算法

摘自 問題定義 給定兩個字串s和t 長度分別為n和m 下標從0開始,定義extend i 等於s i s n 1 與t的最長相同字首的長度,求出所有的extend i 舉個例子,看下表 i0 1234 567s aaaa abbb taaa aacextend i 54 3210 00為什麼說這是k...

擴充套件KMP演算法

擴充套件kmp 擴充套件kmp可以用來解決很多字串問題,如求乙個字串的最長回文子串和最長重複子串。演算法 設next i 為滿足b i i z 1 b 0 z 1 的最大的z值 也就是b的自身匹配 設目前next 0 lenb 1 與ex 0 i 1 均已求出,要用它們來求ex i 的值。設p為目前...