深化對KMP演算法的理解

2021-10-24 20:46:41 字數 1274 閱讀 1118

看到這麼一句話:你的名字是我告白語中的子串

kmp一開始理解起來是比較困難的,下方是結合自己的理解寫出來**,僅作參考

(網上大部分人處理next陣列時,對next陣列整體移動了一格。但是我覺得不是特別好理解,所以我寫的**next陣列並沒有作移動)部分解釋請參考注釋。

#

include

#include

#include

using namespace std;

const

int n =

1e5+5;

int next[n]

;void

getnext

(const

char

*s,int

*next)

else}}

intkmp

(const

char

*t,const

char

*s)else

if(j == lens)

//如需匹配多個,虛擬模式串s[j]有元素(此時肯定失配):j = next[j-1]

break;}

return j == lens ?

(i-lens):-

1;}int

main()

用兩個「指標」:i, j (i在後,j在前

next[i]:儲存串s[0…i]前字尾相等的最大長度,

初始化:next[0] = 0, i = 1,j = 0

考慮的兩種情況:

洛谷:p3375 【模板】kmp字串匹

ac**:

#

include

#include

using namespace std;

const

int n =

1e6+5;

int pnext[n]

;void

getnext

(string p,

int len)

else}}

void

kmp(string s,string p,

int lenp)

else

if(j == lenp)}}

intmain()

cout<

return0;

}

對KMP演算法的理解

kmp演算法是一種高效的模式匹配演算法,複雜度可以達到o m n 而普通模式匹配演算法的複雜度為o m n 普通模式匹配演算法 從主串的第乙個字元 或者給定的第pos個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...

對KMP演算法的理解

kmp演算法是一種高效的模式匹配演算法,複雜度可以達到o m n 而普通模式匹配演算法的複雜度為o m n 普通模式匹配演算法 從主串的第乙個字元 或者給定的第pos個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...

對KMP演算法的理解

kmp演算法是一種高效的模式匹配演算法,複雜度可以達到o m n 而普通模式匹配演算法的複雜度為o m n 普通模式匹配演算法 從主串的第乙個字元 或者給定的第pos個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...