字串匹配之KMP演算法

2021-07-01 23:55:15 字數 1105 閱讀 4941

以前零零散散做了些kmp的題目,一直也沒找出時間整理,這一段又開始研究字串了,就順便把kmp整理了一下。

廢話不說了,我們直接入題。

說到kmp,首先應該知道,它是一種字串查詢演算法,因為是由乙個姓k,乙個姓m和乙個姓p的人聯合發表的,所以就叫kmp演算法了。kmp演算法是一種線性時間的的字串匹配演算法,能在o(m+n)的時間數量級上完成字串的模式匹配操作。它對簡單的模式匹配(就是暴力==)的改進在於,當在一趟匹配過程中出現當前比較的兩個字元不相等時,不需要回溯主串匹配位置指標i,而是利用已遍歷模式串部分的性質,將模式串向右「滑行」盡可能多的距離,再進行比較。所以,我們需要引入乙個以模式串為物件的陣列next,其中用next[ j ]來紀錄當匹配失敗時模式串可向右滑行的最多距離,並定義next[ j ]如下:

由定義可以看出,next[ j ]表示的是:在模式串的第j個字元前面有next[ j ]個連續的字元在已遍歷過的模式串子串的字首。比如,模式串s="abaabcac"的next陣列值如下:

有了next陣列,在模式串匹配的過程中如果在j位匹配失敗,就不需要回溯主串指標i了,只需將模式串指標j向前回溯至next[ j ]位置,再重新匹配即可。

實現**如下:

int next[naxn];

void get_next(string s)//獲得模式串s的next陣列

{ int i=0, j=-1;

next[0]=-1;

while(is[ j ]=s[ next[j] ],那麼我們再次賦值next[ j ],讓next[ j ]=next[ next[j] ]。

優化next陣列實現**如下:

int next[maxn];

void get_next(string s)//獲得模式串s的next陣列

{ int i=0, j=-1;

next[0]=-1;

while(i

演算法 字串匹配之KMP

說人話就是 比如有乙個字串 bbc abcdab abcdabcdabde 我想知道,裡面是否包含另乙個字串 abcdabd 許多演算法可以完成這個任務,kmp演算法是最常用的之一。首先對於上面的 比如 我們首先要針對搜尋詞 abcdabd 算出一張 部分匹配表 接下來就很簡單了,將字串和搜尋詞都從...

字串匹配之KMP演算法

問題定義 字串匹配即是在所有文字t中,找出模式p的所有出現。字串匹配常用的演算法有 樸素演算法 rabin karp演算法 有限自動機演算法 kmp演算法 所有演算法中,算kmp演算法效率最高。也較為難理解。作者曾經認真看了3遍嚴蔚敏的 資料結構 遺憾的是沒有看懂,搞得我一度懷疑自己的智商很低。今天...

字串匹配之KMP演算法

include define maxsize 100 typedef struct sqstring void strassign sqstring s,char cstr 初始化串 s.length i void destroystr sqstring s 釋放串 void strcopy sqs...