KMP模式匹配演算法(回顧)

2021-10-23 21:44:59 字數 1221 閱讀 9196

首先說明這個總結是給自己回顧用的。

1.原始的暴力匹配

public

static

intsubstring

(string s,

int pos, string substring)

else}}

//檢查子字串的標誌長度

//若等於子字串的長度則說明找到了匹配的位置

//若小於子字串的長度則說明沒找到匹配的位置

if(j == substring.

length()

)return i - j;

return-1

;}

2.改進的模式匹配演算法改進後的模式匹配演算法,可以不用每次都讓主串回退到最開始的位置再加一了。

此時增加了乙個next陣列用來記錄模式串的資訊。

next[i] 表示模式串中p[0]…p[i]中能夠發現的字首和字尾相同的最大長度。

next陣列的實現方式如下:

而後用這個陣列實現kmp演算法:

遇見不匹配的情況,主串不用動,直接將子串指標位置

pos = next[pos-1],前面的都是相同的,直接從此處比較就行了。

3.改進next陣列的求法

求解next陣列的時候,不需要像2中那麼麻煩。

我們考慮採用遞推的方式求出next陣列。如果next[0], next[1], … next[x-1]均已知,那麼如何求出 next[x] 呢?  

分情況討論。

首先,已經知道了 next[x-1](以下記為now),如果 p[x] 與 p[now] 一樣,那最長相等前字尾的長度就可以擴充套件一位,則 next[x] = now + 1

如果p[x] 與 p[now] 不一樣,就令now = next[now-1]

而後比較乙個小的前面和後面是否一樣

now如果變小了,則要從變小的地方重新加上來,這是乙個規律

模式匹配 KMP演算法

字串匹配演算法 include includeusing namespace std define ok 1 define error 0 define overflow 2 typedef int status define maxstrlen 255 使用者可在255以內定義最長串長 typed...

模式匹配KMP演算法

前些日子在為目前該學習什麼而苦惱,就問了一下已經從事多年軟體開發的表哥,他說乙個程式設計師要走的遠,就要學好資料結構和演算法,於是我就重新開始學習資料結構和演算法了 拿起以前上過的資料結構看,看到第四章串的模式匹配時,頗感興趣,就寫了一下程式,實踐了一下。感覺還蠻爽,於是就把以下幾個重要的函式放在此...

KMP模式匹配演算法

首先,這是由knuth morris和prattle三人設計的線性時間字串匹配演算法。這裡就不仔細的講解,網上有更好的講解,在這推薦幾個自己當時學習的kmp所看到的較好理解的 這裡附上自己所學的 includeusing namespace std s 是主串 p 是模式串 int next 100...