KMP字元匹配演算法原理

2021-10-04 10:59:00 字數 1364 閱讀 1427

掘金位址鏈結

簡介:kmp演算法是一種改進的字元匹配演算法。由d.e.knuth,j.h.morris和v.r.pratt提出的,因此人們稱它為克努特—莫里斯—普拉特操作(簡稱kmp演算法)。 它的核心思想是,通過乙個next陣列,在匹配失敗後,減少字元移動的距離,達到快速匹配的目的。

要想徹底理解kmp演算法,必須要知道幾個核心概念: 最長相同前字尾:即從前往後找,從後往前找,相同前字尾中最長的字串。 next陣列存放的是子字串最長前字尾的長度。

比如 abcdabd 的next陣列

子字串

字首字尾

最長相同前字尾

最長相同前字尾長度

next[1]a0

next[2]aba

b0next[3]

abca,ab

c,bc

0next[4]

abcd

a,ab,abc

d,cd,bcd

0next[5]

abcda

a,ab,abc,abcd

a,da,cda,bcdaa1

next[6]

abcdab

a,ab,abc,abcd,abcda

b,ab,dab,cdab,bcdabab2

next[7]

abcdabd

a,ab,abc,abcd,abcda,abcdab

b,bd,abd,dabd,cdabd,bcdabd

0關於next的作用,舉個栗子:

假如有字串α=ababc***,要查詢的字串為β= ab*abd

當匹配到這種情況時=> α: **** ab **** abc***

β: ab **** abd***

β的第9個字元與α的第13個字元不匹配,那麼就要移動β字元。

由題設可知β的前8個字元中,1 ~ 2之間的字元(ab)=7~8之間的字元(ab)是相同的,即next[8]=2。

α的第5 ~ 12之間的字元(abab)和β的1~8之間的字元(abab)是匹配的,匹配的長度是8。

由此可知,α的11 ~ 12之間的字元(ab)與β的7~8之間的字元(ab)是相等的

=> α的11 ~ 12之間的字元(ab)=β的1~2之間的字元(ab)

所以我們只要將β字串向前移動的長度=已匹配的長度8 -next[8](β1~8之間字元最長的相

同前字尾(ab)長度)=6;即只要將β向前移動6位

α: **** ab **** abc ***

β:       ab * *** abd ***

從β的第3個字元開始匹配,從而省去了前兩個的匹配時間

字元匹配kmp演算法

前言 之前對kmp演算法雖然了解它的原理,即求出p0 pi的最大相同前字尾長度k 但是問題在於如何求出這個最大前字尾長度呢?我覺得網上很多帖子都說的不是很清楚,總感覺沒有把那層紙戳破,後來翻看演算法導論,32章 字串匹配雖然講到 了對前1.kmp演算法的原理 本部分內容 字串匹配是計算機的基本任務之...

字元匹配 KMP演算法

problem description 給定兩個字串string1和string2,判斷string2是否為string1的子串。input 輸入包含多組資料,每組測試資料報含兩行,第一行代表string1 長度小於1000000 第二行代表string2 長度小於1000000 string1和s...

演算法 KMP 字元匹配

主要參考 理解kmp 的9張ppt 假設模式串為p,原串為s 1 樸素方法 最壞時間複雜度 o p.length s.length 2 kmp 時間複雜度 o p.length s.length kmp演算法步驟 1.構造next陣列 2.將模式串和原串進行匹配 3 kmp相關練習 3道都是模板題,...