kmp模式串匹配

2022-02-02 12:10:42 字數 704 閱讀 7351

作用:字串匹配

我們設匹配串為t,待匹配串為s,這個演算法的功能就是在指定s中,從s的第i位字元開始搜尋,判斷在s中是否有t存在。

如果有則返回出現了t的首位字元位置(當然,這個陣列是從0開始),如果沒有則返回0。

通過next陣列對匹配串t進行乙個預處理,我們獲得乙個next陣列。

下面的描述:string t:從0開始,next:從1開始

i=1;

這個next陣列的意義是:對於我們要處理的字串t裡的第(i-1)字元對應的每乙個next[i]元素

next[i]儲存的是:從t[0]開始到t[i-1]的這一段字串所有字首與字尾的最大匹配長度。

next在kmp演算法裡發揮的作用:在每一次的匹配中,當碰上失配的情況(我們設初始態:t[0]與s[pos]開始比較,如果相等則兩個指標同步增加變數。假設加到j時失配,即s[pos+j]!=t[j])

我們可以利用next陣列儲存的資訊,讓它加速前進(而不是像樸素的模式匹配演算法那樣一位一位地挪,又從t[0]開始與s[pos],提高匹配效率。)

幾番周折還是弄不懂究竟是怎麼運作的,所有只好先把實現的放上來,以後在琢磨是怎麼回事了。以後弄明白了再回來說。。

#include#includeusing namespace std;

void get_next(string t,int *next)

int main()

模式串匹配 KMP

樸素的的模式串匹配演算法通常要在向前移動文字指標之後,回溯模式串指標,其效率為o m n 而kmp演算法則挖掘了一些模式串中的一些資訊,來加快匹配的效率。kmp演算法的緊隨便是覆蓋函式next。當模式串p j 和文字串s i 失配時,j指標不是簡單的回溯,而是指向next j 覆蓋函式next如何定...

模式串匹配,kmp

include include include include define maxstrlen 255 可以在255以內定義最大串長 typedef char sstring maxstrlen 1 0號單元存放串的長度 void get next sstring t,int next void ...

KMP模式串匹配

查詢在乙個很長n的 文字串 中,給定的很短m的 模式串 的出現有無,次數,位置 複雜度o n m 而不是暴力的o n m 這裡對模式串做了乙個神奇的移位法則,注意kmp是只針對模式串的操作,不是文字串 我喜歡把kmp叫做 對應的前一項字首位置 例如 kmp記錄的是怎麼一回事,看圖看資料馬上就明白了 ...