KMP 字串的匹配演算法

2021-06-22 10:21:28 字數 1434 閱讀 7421

一、kmp演算法與brute-force演算法的最大區別就在於kmp演算法在比較時,主串的指標i不用回溯,只需回溯字串的指標j

而brute-force演算法就是簡單的從第乙個字元比到最後一位,這時需要對主串的i進行回溯,這樣演算法的比較次數明顯增多

kmp的演算法複雜度可為o(m +n)而brute-force的演算法複雜度可為o(m*n)。

二、在做kmp時我們可以知道每一次字串j的回溯,即每一次字串後移的位數等於匹配的位數減去部分匹配的位數

即可以得到一公式   移位數 = 匹配位數 - 部分匹配位數

如何得到部分匹配位數呢?

這是由字串的字首與字尾的最大共同的字串決定的。如abdab這是部分匹配位數為2

三、如何推算next呢?

由特殊到一般:

假設:有next[j]= k,即「t[0]...............t[k-1]」=''t[j-k]................t[j-1]'',0此時next[j+1]有兩種情況

字串:t = t[0].........t[j-k]......t[j-1].......t[j]......t[m-1]

t' = t[0].......t[k-1]      t[k]

t' =t[0]....................t[k']

if(t[k] == t[j]) 

//此時我們就需從字串t'中找到t' 等於t[k]的情況

else if(t[k ] != t[j])

//如果沒找到則k = 0

else

//以上**只是分析使用的是偽碼。

kmp**:

/***kmp 字串匹配演算法核心是getnext這一步,要知道在j>1時不匹配應該保證i不變,獲取next[j]的值

*由字串的比較我們可以知道我們可以保證i不變來做比較,i是不用回溯的只需回溯j的值就 可以了

*/

#include #include #include using namespace std;

typedef structkmpstring;

/***字串的比較

*@param s,start ,t,next分別表示主串,開始比較的位置,字串以及next[j]的值

*@return 返回成功匹配後的v值表示成功的第一次出現的下標,如果匹配失敗返回-1; 

*/int kmpindex(kmpstring s,int start,kmpstring t,int next),9},t = ,5};

//kmpstring s = ,8},t = ,5};

int next[100] =;

int count = 0 ;

int pos =0;

cout<<"獲取getnext[j]"<= 0){

cout<<"獲取到匹配成功的位置!"<

KMP演算法 字串匹配

kmp演算法基本思想 我們在用常規的思想做 字串匹配時候是 如 對如 字元如果 t abab 用p ba 去匹配,常規思路是 看 t 第乙個元素 a 是否 和p 的乙個 b 匹配 匹配的話 檢視各自的第二個元素,不匹配 則將 t 串的 第二個元素開始 和 p 的第乙個匹配,如此 一步一步 的後移 來...

KMP字串匹配演算法

kmp核心思想 計算模式串的next陣列,主串的索引在比較的過程中不回朔 ifndef kmp h define kmp h class kmp endif include kmp.h include include include using namespace std int kmp calcu...

KMP字串匹配演算法

在介紹kmp演算法之前,先介紹一下bf演算法。一.bf演算法 bf演算法是普通的模式匹配演算法,bf演算法的思想就是將目標串s的第乙個字元與模式串p的第乙個字元進行匹配,若相等,則繼續比較s的第二個字元和p的第二個字元 若不相等,則比較s的第二個字元和p的第乙個字元,依次比較下去,直到得出最後的匹配...