KMP演算法的C 實現及解釋(簡潔,通俗易懂)

2021-09-20 03:06:28 字數 854 閱讀 7890

最近在回顧字串的匹配相關演算法,把之前的思路又理了理。

有兩個字串str1和str2,我們想知道str2是否在str1中。計算機實現這個有很多演算法,比如bf演算法(暴力匹配演算法,時間複雜度是o(n* m)),rk演算法(bf演算法的公升級版,利用了雜湊演算法,對主串中的n-m+1個子串分別求雜湊值,然後逐個與模式串的雜湊值比較大小,時間複雜度是o(n))。此外還有bm演算法,他是一種非常高效的字串匹配演算法,有實驗統計它的效能是著名的kmp演算法的3到4倍,bm演算法利用壞字元規則和好字尾規則,在模式串和主串匹配的過程中當模式串和主串某個字元不匹配的時候能夠跳過一些肯定不會匹配的情況,將模式串往後多滑動幾位。

kmp演算法同bm演算法一樣也是希望找到某一種規律,使得在匹配時能夠跳過一些肯定不會匹配的情況,將模式串往後多滑動幾位。

//str1為主串,str2為模式串,在str1中檢查是否包含str2,存在則返回起始位置,不存在則返回-1

#include #include #include using namespace std;

void getnext(const string &str2,vectornext)

next[0]=-1;

next[1]=0;

int len= str2.length();

int i=2,cn=0;//cn為最長字首的後乙個字元

while(i0)

cn=next[cn];//不等的話繼續往前推

else

next[i++] =0;//不等的話並未沒法往前推就變為0

}}int kmp( const string &str1, const string &str2,vector& next)

簡潔的KMP演算法,C 實現

next陣列求解 以求c字元之前的最長公共前字尾為例,先假定len為3。字首對應aba,字尾對應bab,由於字首第乙個字元a 不等於 字尾第乙個字元 b,顯然len應該減1 len減一之後,字首對應ab,字尾對應ab,見下圖。則len定為2,next j 2。即next 4 2 全部 如下 incl...

KMP詳細解釋及KMP演算法模板

kmp是什麼,kmp解決什麼型別的問題 kmp全稱為knuth morris pratt演算法,是一種高效的字串匹配演算法,尋找乙個字串中是否包含另乙個字串,例如 char s ababababcab char p ababc s為模板串 主串 p為子串,在s中找到p的位置 暴力匹配演算法 o n ...

KMP演算法的C 實現

這個問題阮一峰老師講的很清楚,鏈結 這裡我只貼一下我的c 實現 include include include include include using namespace std void buildpatchmatchtable int partmatchtable,char findstr ...