一、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的第乙個字元,依次比較下去,直到得出最後的匹配...