KMP模式匹配演算法

2021-10-03 22:58:36 字數 1161 閱讀 6464

演算法實現

改進為了解決一般匹配演算法的低效問題。避免重複的遍歷,我們學習乙個kmp演算法

假設主串s=「abcdefg」,要匹配的字串t=「abcdex」

我們發現a不與後面的子串中任一字元相等。那麼對於一般匹配來說,後面的步驟都是多餘的。

演算法流程如下:

假設現在文字串s匹配到 i 位置,模式串p匹配到 j 位置

1.如果j = -1,或者當前字元匹配成功(即s[i] == p[j]),都令i++,j++,繼續匹配下乙個字元;

2.如果j != -1,且當前字元匹配失敗(即s[i] != p[j]),則令 i 不變,j = next[j]。此舉意味著失配時,模式串p相對於文字串s向右移動了j - next [j] 位。

換言之,當匹配失敗時,模式串向右移動的位數為:失配字元所在位置 - 失配字元對應的next 值,即移動的實際位數為:j - next[j],且此值大於等於1。

next 陣列各值的含義:代表當前字元之前的字串中,有多大長度的相同字首字尾。例如如果next [j] = k,代表j 之前的字串中有最大長度為k 的相同字首字尾。

這就意味著在某個字元失配時,該字元對應的next 值會告訴你下一步匹配中,模式串應該跳到哪個位置(跳到next [j] 的位置)。如果next [j] 等於0或-1,則跳到模式串的開頭字元,若next [j] = k 且 k > 0,代表下次匹配跳到j 之前的某個字元,而不是跳到開頭,且具體跳過了k 個字元。

void

get_next

(string t,

int*next)

else

j=next[j];}

}int

kmp(string s,string t,

int pos)

else

j=next[j];}

if(j>

strlen

(t))

else

return0;

}

我們可以將next陣列進一步改進成nextval陣列。

j123456789

串tababaaaba

next

011234223

nextval

010104210

判斷每個位置和之前的是否相等,相等就用next值,不相等就維持原值。

模式匹配 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...