看到這麼一句話:你的名字是我告白語中的子串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個字元 開始和子串的第乙個字元開始比較,若相等,則繼續比較後面的字元。若不相等,則從主串本次開始比較的字元的下乙個字元開始,與子串的第...