KMP 簡單易懂

2021-10-03 18:24:25 字數 707 閱讀 3762

解決問題

str1中是否有某個子串等於str2,有則返回在str1中得到起始位置。

舉例:abcabck 和 abcabct 此時返回-1

abcabcabct 和 abcabct 此時返回3

常規思路

用str2去比較str1從0開始的每一位,比較結束若有str2返回此時比較的起始位置,否則返回-1

kmp演算法思路

先計算出str2的nexts陣列(起始位-1,計算出其他位置最長字首和最長字尾到的匹配【要求字首不包含最後一位,字尾不包含起始位】)

舉例:str2–「ababat」 則對應得到nexts=

nexts計算:

當前位置為i, 比較字尾開始位置pos - 1和字首開始位置cn,相等時較字首計數+1;

不等時,字首位置往前跳到cn = next[cn];(cn > 0)

否則,當前位置為0

然後str1和str2進行比較:

index1指示str1當前位置,index2指示str2當前位置

1.str1開頭不等於str2起始位置,str1當前位置index1後移一位

2.相等時index1++,index2++

3.經歷2後不等,則從str2的nexts[index2]與str1的index1開始比較,前面部分肯定相等無需再比較

4.比較完後返回index1 - index2

**見演算法高階/高階1/src

kmp演算法 簡單易懂

kmp字串 給定乙個模式串s,以及乙個模板串p,所有字串中只包含大小寫英文本母以及阿拉伯數字。模板串p在模式串s中多次作為子串出現。求出模板串p在模式串s中所有出現的位置的起始下標。輸入格式 第一行輸入整數n,表示字串p的長度。第二行輸入字串p。第三行輸入整數m,表示字串s的長度。第四行輸入字串s。...

通俗講解KMP演算法,簡單易懂

相比較傳統的暴力匹配字串演算法,kmp演算法有了比較大的改進,但是它卻更難理解,尤其是next陣列的求解部分。本人也反覆學習了幾次,每次弄懂但幾個月就忘了,然後就找部落格重新學,下次忘了就能看自己的博文了,哈哈。模式串 abcabcabda 目標串 abcabd 暴力演算法中當目標串第六個字母d不匹...

演算法筆記 字串匹配KMP演算法,簡單易懂

kmp演算法看懂了就會感覺挺容易的,思路也很清晰。看不懂就會稀里糊塗。先說什麼是字串匹配 字串匹配。簡單來說,就是給你兩個字串,尋找其中乙個字串是否包含另乙個字串,如果包含,返回包含的起始位置。比如下面兩個字串 string s1 bacbababadababacacabc string s2 ab...