本文是介紹 什麼是 BF算法、KMP算法、BM算法 三部曲之一。html
KMP算法 內部涉及到的數學原理與知識太多,本文只會對 KMP算法 的運行過程、 部分匹配表 、next數組 進行介紹,若是理解了這三點再去閱讀其它有關 KMP算法 的文章確定能有個清晰的認識。算法
如下的文字描述請結合視頻動畫來閱讀~數組
視頻地址:https://www.bilibili.com/video/av60334201/ide
Knuth-Morris-Pratt 字符串查找算法,簡稱爲 KMP算法,經常使用於在一個文本串 S 內查找一個模式串 P 的出現位置。動畫
這個算法由 Donald Knuth、Vaughan Pratt、James H. Morris 三人於 1977 年聯合發表,故取這 3 人的姓氏命名此算法。spa
是否是感受 Donald Knuth 這個名字很眼熟?沒錯,在前面 這或許是講解 Knuth 洗牌算法最好的文章 一文中也出現了他!3d
下面直接給出 KMP算法 的操做流程:視頻
看不明白?直接看動畫!htm
如下圖文本串 S 與模式串 P 爲例:blog
首先,列出模式串 P 的全部子串:
a | |||||||
---|---|---|---|---|---|---|---|
a | b | ||||||
a | b | a | |||||
a | b | a | a | ||||
a | b | a | a | b | |||
a | b | a | a | b | c | ||
a | b | a | a | b | c | a | |
a | b | a | a | b | c | a | c |
而後,求得每個子串的全部前綴與後綴。
前綴 指除了最後一個字符之外,一個字符串的所有頭部組合;後綴 指除了第一個字符之外,一個字符串的所有尾部組合。
以第五列爲例進行演示。
前綴爲
a | |||
---|---|---|---|
a | b | ||
a | b | a | |
a | b | a |
後綴爲
b | |||
---|---|---|---|
a | b | ||
a | A | b | |
b | a | a | b |
所以,它的前綴後綴的公共元素的最大長度爲 2。
求得原模式串 P 的子串對應的各個前綴後綴的公共元素的 最大長度表 下圖。
根據最大長度表 去求 next 數組:next 數組至關於「最大長度值」 總體向右移動一位,而後初始值賦爲-1。
好了,獲取了 next 數組 後,KMP 算法 的操做就很清晰了。
將模式串 P 與文本串 S 的字母一個個進行匹配,當失配的時候,模式串向右移動。
怎麼移動?
好比模式串的 b 與文本串的 c 失配了,找出失配處模式串的 next數組 裏面對應的值,這裏爲 0,而後將索引爲 0 的位置移動到失配處。
原文出處:https://www.cnblogs.com/fivestudy/p/11287725.html