擴充套件KMP詳解

2022-05-27 19:00:11 字數 1639 閱讀 3337

最近新學的三個演算法,一直都沒寫部落格,字尾自動機和線性基還有一點小尾巴,爭取這兩天結束

求\(t\)串與\(s\)串的每個字尾的最長公共字首

**假設當前遍歷到s串位置i,即nxts[0]...nxts[i - 1]這i個位置的值已經計算得到。設定兩個變數,st和pos。pos代表以st為起始位置的字元匹配成功的最右邊界,也就是"pos = 最後乙個匹配成功位置"。相較於字串t得出,s[st...pos]等於t[0...pos-st]。

再定義乙個輔助陣列int nxtt,其中nxtt[i]含義為:t[i]...t[m - 1]與t的最長相同字首長度

根據第一條得出:s[i]對應t[i - st],s[i...pos] = t[i - st...pos - st],同時我們已經知道t[i - st...]與t的最長公共字首,而t[i - st...pos - st]的最長公共字首一定比它小,所以如果i + nxtt[i - st] < pos,說明最長公共字首在我已知的範圍內,根據nxtt陣列的定義,此時nxts[i] = nxtt[i - st]。

如果i + next[i - st] == pos呢?s[pos+1] != t[pos - st + 1]且t[pos - i + 1] != t[pos - st + 1],但s[pos]有可能等於t[pos - i + 1],所以我們可以直接從s[pos + 1]與t[pos - i + 1]開始往後匹配,加快了速度。

如果i + nxtt[i - st] > pos呢?那說明s[i...pos]與t[i-st...pos-st]相同,注意到s[pos + 1] != t[pos - st + 1]且t[pos - i + 1] == t[pos - st + 1],也就是說s[pos + 1] != t[pos - i + 1],所以就沒有繼續往下判斷的必要了,我們可以直接將nxts[i]賦值為pos - i + 1。

明天更……

第一次擴充套件

for (int i = 0;s[i] == t[i]&&i < lent&&i < lens;i++) pos++,nexts[0]++;
4和5兩條可以合併

if (nextt[i-st] >= pos-i+1)
第3條

else nexts[i] = nextt[i-st];
完整**:因為我需要先求乙個nxtt,所以需要呼叫兩邊函式

for (int i = 2,l = 1,r = 1;i <= lenb;i++)

if (i+kmpa[i]-1 > r) l = i,r = i+kmpa[i]-1;

} for (int i = 1,l = 0,r = 0;i <= lena;i++)

if (i+kmpb[i]-1 > r) l = i,r = i+kmpb[i]-1;

}

擴充套件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 擴充套件KMP

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

擴充套件kmp

出自 2 i k l 1 p k,即i l p。這時,首先可以知道a i.p 和b 0.p i 是相等的 因為a i.p b i k.p k 而i k l 1 p k,由b 0.l 1 b i k.i k l 1 可得b 0.p i b i k.p k 即a i.p b 0.p i 然後,對於a p...