kmp演算法是由knuth,morris和pratt三人設計的線性時間字串匹配演算法。其以
kmp模式匹配演算法之所以能夠快速進行模式匹配,是因為其在模式匹配過程中利用模式串自身的資訊去規避了無用檢測,並因此不需要在失配時進行如樸素模式匹配演算法中的大量的回溯操作。它結合了模式串自身的資訊,並在失配時結合已經成功匹配的字首,並將模式串向前移動並避開重複比較的步驟。
首先觀察下面的kmp演算法模式的匹配過程:
其中位置
隨後,kmp演算法又從之前失配的位置重新開始嘗試匹配。值得一提的是,這種將模式串向前移動的操作恰好避開重複檢測並能使得模式串向前移動最長的距離。在上面的例子以及普遍的情況下,若前移的距離比正確距離短,則會導致新的位置下的模式串失配(移動距離更短意味著這個字首有著更長的相同前字尾),若前移的距離比正確距離長,則會導致演算法缺失匹配步驟,甚至錯過正確的解。因此,通過這樣的匹配過程,kmp模式匹配演算法能夠正確而快速地找到目標串中模式串的位置。
上面關於kmp演算法模式匹配過程的描述中提到了乙個關鍵輔助引數——已匹配字首的最長相同前字尾長度。在模式匹配過程中,失配可能從模式串的任意位置發生,所以也需要獲得任意長度字首的最長相同前字尾長度。而字首函式,便是乙個要獲得任意長度字首的最長相同前字尾長度的過程。
(to be continued)
下面的函式是kmp演算法的c++實現,因為目標串中可能包含多個與模式串相同的子串,所以該函式可能會返回多個成功匹配的首位置。這裡用變長陣列實現了該功能,並且當沒有在目標串中找到模式串時會返回空的陣列。
#include #include using namespace std;
vector& kmpmatch(string & obj, string & pattern);
int * prefix(string & pattern);
#include "match.hpp"
vector& kmpmatch(string & obj, string & pattern)
}return *pos;
}int * prefix(string & pattern)
return pref;
}
(to be continued) 演算法導論(九)kmp匹配演算法
演算法導論第 章 題目 pku1961,pku2406,pku2752 首先舉個例子 要在乙個字串中找到和ababaca匹配的字串的個數.b a c b a b a b a a b c b a b a b a b aca 在這裡前面有 個已經匹配成功,第六個不成功.通過觀察可以知道,並不需要往後面移...
模式匹配 KMP演算法
字串匹配演算法 include includeusing namespace std define ok 1 define error 0 define overflow 2 typedef int status define maxstrlen 255 使用者可在255以內定義最長串長 typed...
模式匹配KMP演算法
前些日子在為目前該學習什麼而苦惱,就問了一下已經從事多年軟體開發的表哥,他說乙個程式設計師要走的遠,就要學好資料結構和演算法,於是我就重新開始學習資料結構和演算法了 拿起以前上過的資料結構看,看到第四章串的模式匹配時,頗感興趣,就寫了一下程式,實踐了一下。感覺還蠻爽,於是就把以下幾個重要的函式放在此...