——莫里斯
——普拉特
操作(簡稱kmp演算法)。kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。其中實現減少匹配次數的主要方法是提前算出模板的乙個部分匹配表next。
先舉個例子吧,文字是abcabcdabdabcdabc,模板是abcdabc,
模板的匹配陣列next表示如下:
匹配的過程如下:
第1次匹配,文字a位置匹配失敗,則由k - next[k - 1]得到跳躍的間隔為3 - 0 = 3。
2次匹配,文字d位置匹配失敗,則由k - next[k - 1]得到跳躍的間隔為6 - 2 = 4。
3次之後的匹配,與上述相同。
上述的過程,其實精華在於如何算出它的跳躍步數,想法是字首和字尾匹配的最大值,從模板分析:
對於1個字母,無字首字尾,所以為0;
對於2個字母,字首為a,字尾為b,所以為0;
對於3個字母,字首為,字尾為,無匹配,為0;
對於4個字母,字首為,字尾為,無匹配,為0;
對於5個字母
,字首為,字尾為,a匹配,長度為1,為1;
對於6個字母
,字首為,字尾為,ab匹配,長度為2,為2;
對於7個字母
,字首為,字尾為,abc匹配,長度為3,為3;
到這裡,分析完畢,下面附上kmp演算法c++版:
#include #include using namespace std;
void getnextframe(string needle, int* next)else }}
int kmpsearch(string haystack, string needle) ;
getnextframe(needle, next);
int i = 0;
while(needle[0] != haystack[i])
i++;
int j = i;
int k = 0;
while(i <= haystack.length() - needle.length() && j < haystack.length())
elseelse
} }return -1;
}int main(){
string haystack = "babbbbbabb";
string needle = "bbab";
int firstpos = kmpsearch(haystack, needle);
if(firstpos < 0)
cout<
關於KMP演算法的理解
上次因為haipz組織的比賽中有道題必須用到kmp演算法,因此賽後便了解了下它,在仔細拜讀了孤 影神牛的文章之後有種茅塞頓開的感覺,再次orz。附上鏈結 對於整個kmp演算法,最精髓的部分便是關於next陣列的生成。一開始ruijia liu的書上貼上的 感覺完全不能理解,但是看神犇的分析覺得似乎明...
自我理解的KMP 演算法 模式匹配
首先,kmp最重要的是next 函式的設計,下面是next函式的原理 純手寫,可跳過不看,網上有比較抽象的理論,但是比較難以理解 下面是 部分,重點在於 get next 函式體 kmp模式匹配演算法 include include define substring len 50 子串長度為50 i...
關於KMP演算法的個人理解
最近準備接下來的校招面試,一直沒學過資料結構的我,也不得不準備準備這方面的知識。對於字串匹配這個課題,現在有很多的方法,然kmp確實其中經典的一種方法,這兩天找了很多的相關資料,卻發現理解很簡單,而實現卻有點小困難,為了永久解決這個問題,苦心鑽研了下,現把我的理解記錄如下,供有相同疑惑的童鞋一起學習...