c 實現初級kmp演算法,太難了

2021-10-03 19:37:11 字數 972 閱讀 4558

摘於王道機試題的一段話:

kmp演算法是一種改進的字串匹配演算法,其核心是,模式串匹配失敗後,並不是從下一字元開始重新匹配,而是利用已有資訊(next陣列),跳過一些不可能匹配成功的位置,以減少匹配次數。

在此十分感謝這篇博文,看了一晚上只有這篇博文茅塞頓開。

下面記錄一下我的理解:

1.在求next陣列時,判斷next[i] = next[j]時,相當於從最長前字尾開始匹配,以後綴為主。以最長字尾為例,每乙個字尾必定都包含最後乙個字元,故i首先指向的就是最後乙個字元,如果最後乙個字元不匹配,那麼就不用看了,最長公共前字尾的數量可定要減,也就是j指向更小的字首的最後。

2.j = next[j]這步,相當於跳回次長字首的最後,如上文。

#include

#include

#include

#include

#include

#include

using

namespace std;

/*kmp演算法太難了

*/void

getnexttable

(char

*pat,

int*next,

int len)

else

}// for(int k = 0;k// printf("%d ",next[k]);

// printf("\n");

}int

kmp(

char

*str,

char

*pat,

int*next,

int n,

int m)

else}if

(j == m)

return i-j+1;

else

return-1

;}intmain()

return0;

}

KMP演算法c 實現

遞推求解next陣列,初始的情況是next 0 1.假設在某乙個時刻有如下的等式成立 str 0.k 1 str j k.j 1 那麼next j k,在這個前提下,繼續進行下乙個字元的匹配.1 如果str 0.k str j k.j 那麼next j 1 next j 1 k 1.2 反之,如果上...

KMP演算法C實現

這種演算法是d.e.knuth 與v.r.pratt和j.h.morris同時發現的,因此人們稱為kmp演算法。此演算法可以在o n m 的時間數量級上完成串的模式匹配操作。其基本思想是 每當匹配過程中出現字串比較不等時,不需回溯i指標,而是利用已經得到的 部分匹配 結果將模式向右 滑動 盡可能遠的...

KMP演算法C 實現

kmp演算法事模式匹配的高效演算法,很少,但是卻不是很容易理解。這幾天剛好做了一些這方面的調研,寫了乙個c 實現版本的kmp演算法,貼出來亮亮。其實kmp演算法最重要的部分是next陣列的計算方法,這裡有一篇講解得非常到位的文章 而再計算完next陣列之後實現模式的匹配就簡單多了,基本得策略與計算n...