字串匹配演算法之kmp演算法

2022-03-05 00:59:59 字數 1574 閱讀 1864

kmp演算法是一種效率非常高的字串匹配演算法,是由knuth,morris,pratt共同提出的模式匹配演算法,所以簡稱kmp演算法

在乙個字串中查詢另乙個字串時,會遇到如下圖的情況

我們通常的做法是從第乙個串a的下一位b再逐位比較,但這樣的做法非常低效。

仔細思考一下發現,第乙個串已經匹配的部分就是第二個串的字首。如果我們對第二個串進行一些預處理,或許就不用再去逐位比較了。

kmp演算法就是預處理出要查詢串每個字首的最大相同前字尾的長度,通俗一點就是兩個相同的串在不重合情況下最大的重疊長度

如上圖中abcdab字首的最大相同前字尾就是ab,長度為2

如果還匹配不成功,則繼續將查詢串後移到第乙個仍然能匹配成功位置,發現沒有,就從頭比較

這時從頭比較也不成功,就將兩個的比較位置都後移

總結:

對於上圖的字串,它的前三個字首沒有最大相同前字尾

第四個字首abda,因為第乙個字元和最後乙個字元相同,所以它的最大相同前字尾為1

第五個字首,只需比較第四個字首最大相同前字尾的後乙個字元和最後乙個字元(第乙個b和第二個b)就行了,

如果相等,則第五個字首最大相同前字尾長度=第四個字首最大相同前字尾長度+1,並且一定是最大的

重點:如果最後乙個字元與前乙個字首的最大相同前字尾的後乙個字元不相等

考慮的最大相同前字尾

前乙個字首

的最大相同前字尾是

但最後乙個字元d不等於最大相同前字尾的下乙個字元c

這時字串的最大相同前字尾一定小於5了,並且abdab已經匹配成功

我們就要再找字尾abdab的乙個字尾與字首abdab的乙個字首進行匹配,

這就是字首abdab的最大相同前字尾ab。

我們比較

的最後乙個字元d和字首

的下乙個字元d發現它們相等,則

的最大相同前字尾為abd。

**:

inline void next(const

char a,int next,int l)

if(a[i]==a[k])k++;//

相等就為上乙個最大相同前字尾長度+1,不相等就是0;

next[i]=k;}}

inline void kmp(const

char a,const

char b,int next,int l1,int l2)}}

字串匹配演算法之 KMP演算法

關於kmp演算法的描述,推薦一篇部落格 該部落格詳細的描述了kmp演算法原理。下面的 實現了kmp演算法 1 使用暴力窮舉法,kmp演算法完成字串匹配演算法 2 include iostream 3 include string 4 include vector 5 using namespace ...

字串匹配之KMP演算法

以前零零散散做了些kmp的題目,一直也沒找出時間整理,這一段又開始研究字串了,就順便把kmp整理了一下。廢話不說了,我們直接入題。說到kmp,首先應該知道,它是一種字串查詢演算法,因為是由乙個姓k,乙個姓m和乙個姓p的人聯合發表的,所以就叫kmp演算法了。kmp演算法是一種線性時間的的字串匹配演算法...

演算法 字串匹配之KMP

說人話就是 比如有乙個字串 bbc abcdab abcdabcdabde 我想知道,裡面是否包含另乙個字串 abcdabd 許多演算法可以完成這個任務,kmp演算法是最常用的之一。首先對於上面的 比如 我們首先要針對搜尋詞 abcdabd 算出一張 部分匹配表 接下來就很簡單了,將字串和搜尋詞都從...