掘金位址鏈結
簡介: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道都是模板題,...