總忘,很痛苦!簡單總結一下步驟呃呃呃呃呃呃
求next數組
以字符串abaabc
為例。
①雖然不知道發生了什么總之我先填個-1
和0
在這里
a | b | a | a | b | c |
---|---|---|---|---|---|
-1 | 0 |
②這時已有字符串ab
,沒有重復的前后綴,于是再寫個0
a | b | a | a | b | c |
---|---|---|---|---|---|
-1 | 0 | 0 |
③已有字符串aba
,最長相等前后綴a
長度是1,寫個1
a | b | a | a | b | c |
---|---|---|---|---|---|
-1 | 0 | 0 | 1 |
④已有字符串abaa
,最長相等前后綴依舊為a
,還是1
a | b | a | a | b | c |
---|---|---|---|---|---|
-1 | 0 | 0 | 1 | 1 |
⑤已有字符串abaab
,最長相等前后綴ab
,寫2
([a,b];[ab,ab];[aba,aab];[abaa,baab])
a | b | a | a | b | c |
---|---|---|---|---|---|
-1 | 0 | 0 | 1 | 1 | 2 |
⑥你擁有了一個next數組(視情況給每項+1)!神奇吧!
字符串匹配
以主串Taabaabaabaac
和模式串saabaac
為例。
①按照之前的方法求出aabaac
的next數組
a | a | b | a | a | c |
---|---|---|---|---|---|
-1 | 0 | 1 | 0 | 1 | 2 |
②第一個不匹配的字符c
對應的next數組中數值為2
a | a | b | a | a | a | a | b | a | a | c | |
---|---|---|---|---|---|---|---|---|---|---|---|
a | a | b | a | a |
所以將s[2](即字符串s的第三位)和出錯的那一位對齊,再次比較
a | a | b | a | a | {b} | a | a | a | a | c | |
---|---|---|---|---|---|---|---|---|---|---|---|
a | a | {b} | a | a |
再次對齊
a | a | b | a | a | b | a | a | {b} | a | a | c |
---|---|---|---|---|---|---|---|---|---|---|---|
a | a | {b} | a | a | c |
③成功了耶!信積拉奶!(
拓展&總結
做題特化(指不管原理只管答案)
想要原理的話可以看看如何更好地理解和掌握 KMP 算法? - 知乎
over,希望能幫助到現實主義者的你!(