kmp演算法是一種改進的字串匹配演算法,由d.e.knuth與v.r.pratt和j.h.morris同時發現,因此人們稱它為克努特——莫里斯——普拉特操作(簡稱kmp演算法)。
kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。即確定下一次應該從那個位置重新開始匹配。
char*obj = "cbcba";
char*src = "sdcbcbcba";
要在src中尋找obj,過程如下:
從src第0位開始匹配,s匹配失敗,移動1位,
從d開始匹配,d匹配失敗,移動1位,
接著從src第2位c開始,匹配,繼續b,匹配,繼續c,匹配,繼續b,匹配,繼續c,不匹配,
kmp演算法關鍵點就在這裡,要移動最大的距離,在這裡是2位,即從src第二位移動到第四位,下次從第四位的c開始匹配。
對於乙個要查詢的目標字串,每次在哪一位匹配失敗後要移動的最大距離可以提前算出來,存到乙個陣列裡,匹配時直接查詢就行。
純粹自己實現,
**有些醜陋,呵呵
// kmp.cpp : 定義控制台應用程式的入口點。
//#include "stdafx.h"
#includeusing namespace std;
int*kk;
int*kkk;
int kmp(char*src, char*obj)
while (k2 < len2+1&&k1+k2 < len1+1)
else
if (obj[k2 - kk[k2]] == src[k1 + k2])
else
} }return -1;
}int* shift(char*obj)
kk[0] = 1;
if (len > 1)
else
kk[1] = 1;//條件是src與obj第1位匹配的字元等於obj第0個字元,否則kk[1]=2,這由匹配時的src決定 }
int k = 2;
int n = 0;
int m = 1;
while (k < len)
{ bool flag = false;
bool flag1 = false;
while (m
字串匹配與KMP演算法
參考 j.boxer s blog the knuth morris pratt algorithm in my own words.在電腦科學中,knuth morris pratt字串查詢演算法 簡稱為kmp演算法 可在乙個主文字字串 s 內查詢乙個詞 w 的出現位置。此演算法通過運用對這個詞在...
KMP字串匹配演算法過程原理
此演算法的關鍵是求next j 若設在進行某一趟匹配比較時在模式p的第j位失配,如果j 0,則目標串指標t進一,模式串指標p回到p0p0 繼續進行下一趟匹配比較。知道了next陣列怎麼使用後,再介紹kmp演算法的原理。樸素模式匹配速度慢的原因是有回溯,而這些回溯是可以避免的。例如 ta b b a ...
KMP演算法 字串匹配
kmp演算法基本思想 我們在用常規的思想做 字串匹配時候是 如 對如 字元如果 t abab 用p ba 去匹配,常規思路是 看 t 第乙個元素 a 是否 和p 的乙個 b 匹配 匹配的話 檢視各自的第二個元素,不匹配 則將 t 串的 第二個元素開始 和 p 的第乙個匹配,如此 一步一步 的後移 來...