鹹魚程序員之-算法第二篇-KMP算法

KMP算法 是經典的字符串匹配算法 ,相對於暴力匹配算法來說 效率要高得多 。

KMP算法是又三位BIG OLD(KAN MAO PIAN ) D.E.Knuth、J.H.Morris和V.R.Pratt一起發明的神級算法 。。。 

KMP算法要解決的問題就是在字符串(也叫主串)中的字串(pattern)定位問題  

如果字串在一個主串中完全匹配,就返回它的首位下標,否則返回-1。。。。

通常我們最容易想到的匹配思想是暴力匹配(如果暴力匹配不懂可以看我第一篇算法)。這種思想就是如果不匹配主串下標向後移動一位 字串重新從第一位開始匹配。

KMP算法的整體思路是什麼樣子呢?讓我們來看一組例子:

第一輪,模式串和主串的第一個等長子串比較,發現前5個字符都是匹配的,第6個字符不匹配,是一個“壞字符”:

 

我們可以發現,在前綴“GTGTG”當中,後三個字符“GTG”和前三位字符“GTG”是相同的:

在下一輪的比較時,只有把這兩個相同的片段對齊,纔有可能出現匹配。這兩個字符串片段,分別叫做最長可匹配後綴子串和最長可匹配前綴子串。

第二輪,我們直接把模式串向後移動兩位,讓兩個“GTG”對齊,繼續從剛纔主串的壞字符A開始進行比較:

顯然,主串的字符A仍然是壞字符,這時候的匹配前綴縮短成了GTG:

 

 

按照第一輪的思路,我們來重新確定最長可匹配後綴子串和最長可匹配前綴子串:

 

第三輪,我們再次把模式串向後移動兩位,讓兩個“G”對齊,繼續從剛纔主串的壞字符A開始進行比較:

 

以上就是KMP算法的整體思路,至於這裏的最長匹配字串就不具體闡述了 。總之,

如果不匹配,則字串的下標不要進行回溯 ,字串所要移動的位置=前面已經匹配的字符串長度-匹配標對應的前一個的值。

下面獻上小編的java 代碼實現部分:

思路: 我們需要實現兩個方法 ,一個是獲取匹配表,第二個就是搜索。

1.獲取匹配表

 

2 搜索實現

okay 測試方法測試一下:

我們發現 結果是理想的,,,雖然第一次看起來有點難度,但是仔細研究下不算很難。希望對你有所幫助。。。。。

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章