推薦閱讀徹底搞懂kmp演算法原理
本文採用下標0開始的陣列來實現next陣列,下標1開始的**以注釋表示。
主串:ababcabcacbab
模式串:abcac
計算所得next陣列:-1 0 0 0 1
next陣列**:
void
get_next
(int next,
char str)
else
}}
查詢模式串位置模板
int
findpos
(char a,
char b,
int pos,
int next)
if(jreturn-1
;//查詢失敗返回-1
else
return i-
strlen
(b);
}
#
include
#include
#define
maxsize
100//陣列最大長度
char stra=
"ababcabcacbab"
;//主串
char strb=
"abcac"
;//模式串
int lena,lenb;
//串長
int kmp[maxsize]
;//next陣列
void
get_next
(int next,
char str)
else}}
intfindpos
(char a,
char b,
int pos,
int next)
if(jreturn-1
;//查詢失敗返回-1
else
return i-lenb;
}int
main()
printf
("\nsublist's position:%d"
,findpos
(stra,strb,
0,kmp));
//輸出下標
return0;
}
mainstring:ababcabcacbab
substring:abcac
nextlist:-1
0001
sublist's position:
5
設主串和模式串長度分別為m,n
kmp演算法的時間複雜度是o(m
+n
)o(m+n)
o(m+n)
,而bf演算法的時間複雜度為o(m
n)
o(mn)
o(mn
),但是實際上bf演算法在計算機執行時間近似於o(m
+n
)o(m+n)
o(m+n)
,所以bf演算法仍然廣泛使用,kmp演算法比較適合主串和模式串有很多「部分匹配」的情況。
C KMP演算法的實現
kmp演算法是一種改進的 字串匹配 演算法,由d.e.knuth,j.h.morris和v.r.pratt同時發現,因此人們稱它為 克努特 莫里斯 普拉特操作 簡稱kmp演算法 kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。具體實現就是實現乙個next...
c kmp演算法字元匹配 KMP模式匹配演算法
我從對暴力匹配演算法的優化角度出發,理解和構造出kmp演算法。模式匹配問題中,有主串,子串,模式串,字首,字尾,部分匹配值等等概念。教材往往 反著來 先有解決方案和概念,再強行說 啊,就是這樣子的 但我們都應該清楚,概念是輔助思考,輔助解決遇到的問題的。假設我們已經弄懂了暴力匹配解決模式匹配的方法,...
C KMP演算法之next陣列的生成
對於乙個字元來說,如果這個字元向前追溯n個,與從開頭開始向後數n個的字串完全相同,則這個數的next陣列的值為n 1 對於從0開始標號的字元陣列來說,這個數的next陣列的值為n include include using namespace std intmain next 0 1 生成next陣...