KMP過程原理說明與實現 跳轉表是核心!

2021-09-07 14:12:52 字數 1473 閱讀 3126

圖1,上方主串與下方模式串出現不匹配字元d,則如下圖所示,因模式串d前方的ab與模式串的字首ab重複,則模式串跳轉到當前位置的前方最長重複字首即ab的後乙個位置c,繼續比較。

圖2

圖3,以此類推,直到模式串全部匹配或者主串結束

(以上三個圖來自阮一峰部落格)

#include #include 

//雙指標(查重指標tail字首指標pre)比較公共字首,最終生成模式串每個位置與主串某位置不匹配時的模式串跳轉表,

//跳轉的位置是當前位置的前方所匹配的最長公共字首的後乙個位置,跳轉後繼續比較

void getnext(char p,int len, int

next)

else

lastchar = tail-1;//

需要比較查重指標與字首指標前一位置是否相同【跳轉位是其前方所重複字首的後一位置,如上圖所示,當前位不匹配時跳轉到其前方所重複字首的後一位置】

frontchar = pre-1

; }

}int match(char s, int slen, char p, int plen, int

next)

else

}if(j==plen)

return0;

}//簡單匹配——可用來對kmp結果驗證

int match0(char s, int slen, char p, int

plen)

else

}int pos = -1;//

負數表示不匹配

if (j ==plen)

return

pos;

}int main(int argc, char

const *ar**)

; getnext(p, p_length, next);

int pos =match(s, s_length, p, p_length, next);

printf(

"kmp:the first matched position is %d\n

", pos);

int pos0 =match0(s, s_length, p, p_length);

printf(

"******:the first matched position is %d\n

", pos0);

return0;

}

KMP 演算法原理解析與 C 實現

kmp 演算法包含兩個部分 利用 pattern 構建 next 陣列 利用 next 資料去匹配長字串 使用 kmp 演算法的好處是,對於被匹配的長字串,我們始終不需要往回走。next 陣列中的每乙個元素,比如說 next i 代表的是在 pattern 中第 i 個位置之前存在的字首和字尾相等的...

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

kmp演算法是一種改進的字串匹配演算法,由d.e.knuth與v.r.pratt和j.h.morris同時發現,因此人們稱它為克努特 莫里斯 普拉特操作 簡稱kmp演算法 kmp演算法的關鍵是利用匹配失敗後的資訊,儘量減少模式串與主串的匹配次數以達到快速匹配的目的。即確定下一次應該從那個位置重新開始...

SQL注入實現原理與攻擊過程詳解

sql注入攻擊的實現原理 結構化查詢語言 sql 是一種用來和資料庫互動的文字語言,sql injection就是利用某些資料庫的外部介面把使用者資料插入到實際的資料庫操作語言當中,從而達到入侵資料庫乃至作業系統的目的。它的產生主要是由於程式對使用者輸入的資料沒有進行細緻的過濾,導致非法資料的匯入查...