1.串匹配的樸素方式;
已知兩個串,源 abcde 模式串 de ;
用3個指標, 開頭匹配,然後分別 增加,直到全匹配為止;否則 移動 de。**如下:
int brutal_force(char *s,char*t){
int slen= strlen(s);
int tlen= strlen(t);
int i = 0;
while(i
2.kmp的方式
思想就是發生不匹配的時候,模式串盡量多移動
例如 ababd 匹配
abababdc 的時候 到最後一位 模式串的第五位 不匹配
應該直接移動 兩位,而且開頭的部分不用再比較,仍然從源串的第五位和next[5]繼續比較
ababd
abababdc
這個移動的位置,儲存 在next [m]的陣列中,這個值只與 模式串的固有屬性有關。
這裡就不細細討論原理, 這個值就是 : t[0],t[1]...t[m-1]的字首和字尾的最長匹配長度。
這個next陣列的求解**十分巧妙簡短,可以用迴圈不變式驗證。
**如下:
void index(char *t){
int len = strlen(t);
int j = -1;
int i = 0;
next[i]=j;
while(i
index部分還可以優化一下,即 如果 s[i]!=t[j] 時 就會更新 j=next[j] 但是要避免 t[j]==t[next[j]]的情況。 所以給next 陣列加這條約束 例如aaaaaaab 求next的時候就會做很多無用功 ,退化成樸素的方式了。
修改了某4行 :
int next_val[5];
void get_next_val(char *t){
int len = strlen(t);
int j =-1;
int i = 0;
next_val[i]=j;
while(i
KMP及KMP改進演算法
kmp 看毛片 演算法確實很難理解,上網搜了半天想了很久才大概想明白。kmp演算法精華在於next陣列 部分匹配值 即next陣列就是 字首 和 字尾 的最長的共有元素的長度。以 abcdabd 為例,a 的字首和字尾都為空集,共有元素的長度為0 ab 的字首為 a 字尾為 b 共有元素的長度為0 ...
BF演算法及KMP演算法
一.bf演算法 1.原理 暴力查詢 逐個匹配主串字元,然後模式串j值回溯到1重新匹配 2.實現 二.kmp演算法 1.原理 核心是避免不必要的回溯 問題是由模式串決定,不是目標串決定 只需要將j值模式串中j的位置回溯到next j 位,而免除了前面不需要的匹配,以此來換取時間 2.難點拆解 前字尾 ...
KMP演算法及應用
kmp演算法用來解決一系列字串單模式匹配問題,其以難理解,難記憶著稱。其next陣列的構造就如同ac自動機中的fail指標,就是如果匹配失敗,字串應從 開始繼續匹配。這裡的next陣列表示 next i 前i個字元的公共最長前字尾長度。覺得對於kmp演算法,這篇寫的不錯 現在來講一下應用。給定兩個字...