KMP模式匹配演算法

2021-09-24 16:50:18 字數 1159 閱讀 5452

kmp模式匹配演算法改進:

意義:當子串有多個相同部分時,與樸素模式匹配演算法相比,大大減少了迴圈次數。時間複雜度由o((n-m+1)*m)變為o(n+m)。

重點:對用於匹配的子串的next陣列的構建。next陣列表示若當前位不匹配我們該從第幾位開始重新比較。

next陣列舉例說明:

我們用 j 來表示子串中第幾位,為方便我們從1開始計數。

eg1:當子串無重複時

子串abcdx

1、j = 1,next[1] = 0;

2、j = 2, j到j -1 之間為a,因此只有一位next[2] = 1;

3、j = 3, j到j -1 之間為ab, 且 a != b, 因此next[3] = 1;

…我們可以得到next陣列01111。

eg2: 當子串有重複時

子串:abcabx

1、j = 1,next[1] = 0;

2、j = 2, j到j -1 之間為a,因此只有一位next[2] = 1;

3、j = 3, j到j -1 之間為ab, 且 a != b, 因此next[3] = 1;

4、j = 4, j到j -1 之間為abc, 且 a != c, 因此next[4] = 1;

5、j = 5, j到j -1 之間為abca, 且 a == a, 因此next[5] = 2;

6、j = 6, j到j -1 之間為abcab, 且 ab == ab, 因此next[6] = 3;

具體**實現:

void

getnext

(string t,

int*next)

else

j = next[j]

;//若不相等,則跳轉到上一回溯位置看是否相等。}}

intpos_kmp

(string s, string t,

int pos)

else

j = next[j]

;//此處是與樸素模式匹配演算法不同處,不用每次都從第一位開始比較}if

( j > t.

size()

)return i - t.

size()

;else

return0;

}

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