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 測試方法測試一下:
我們發現 結果是理想的,,,雖然第一次看起來有點難度,但是仔細研究下不算很難。希望對你有所幫助。。。。。