首先說明這個總結是給自己回顧用的。
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...