C KMP演算法的實現

2021-08-18 02:32:13 字數 1040 閱讀 8748

kmp演算法是一種改進的

字串匹配

演算法,由d.e.knuth,j.h.morris和v.r.pratt同時發現,因此人們稱它為

克努特——

莫里斯——

普拉特操作(簡稱kmp演算法)。kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現乙個next()函式,函式本身包含了模式串的區域性匹配資訊。

時間複雜度

o(m+n)。

示例:主串s:ababaaababcaa

模式串t:ababc

第一步:

先求出模式串「abcdex」的next陣列:

第二步:

開始匹配

兩個串的前4個字元完全一樣,直到第5個,『a』與『c』匹配失敗。

此時j不需要回溯到1,而是回溯到next[j]即可。

以此類推,即可獲取匹配的結果

void getnextvalue(char* t,int *nextval, int size_t)          //求模式串的next陣列並存入nextval中

else

}}int index_kmp(char* s,char* t,int pos, int size_s, int size_t) //從主字串s的pos位置開始匹配模式串t

else

}

C KMP演算法手工實現

推薦閱讀徹底搞懂kmp演算法原理 本文採用下標0開始的陣列來實現next陣列,下標1開始的 以注釋表示。主串 ababcabcacbab 模式串 abcac 計算所得next陣列 1 0 0 0 1 next陣列 void get next int next,char str else 查詢模式串位...

C KMP演算法之next陣列的生成

對於乙個字元來說,如果這個字元向前追溯n個,與從開頭開始向後數n個的字串完全相同,則這個數的next陣列的值為n 1 對於從0開始標號的字元陣列來說,這個數的next陣列的值為n include include using namespace std intmain next 0 1 生成next陣...

c kmp演算法字元匹配 KMP模式匹配演算法

我從對暴力匹配演算法的優化角度出發,理解和構造出kmp演算法。模式匹配問題中,有主串,子串,模式串,字首,字尾,部分匹配值等等概念。教材往往 反著來 先有解決方案和概念,再強行說 啊,就是這樣子的 但我們都應該清楚,概念是輔助思考,輔助解決遇到的問題的。假設我們已經弄懂了暴力匹配解決模式匹配的方法,...