KMP字串匹配演算法的原理與實現

2021-07-03 17:58:07 字數 1233 閱讀 5929

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 的第乙個匹配,如此 一步一步 的後移 來...