KMP算法是經典的字符串匹配算法,在串行時時間複雜度爲線性。KMP算法的思想很簡單,將參與匹配的模式串部分視爲週期串(最短)後接前綴串,週期串重複出現次數記爲K,週期串長度記爲L。當模式串的第j位與正文串第k位比較時(假設模式串首位與正文串第x位比較),如果字符不相同,最簡單的方法是將模式串相對於正文串的位置向後移動一位,即模式串從正文串第x+1位開始匹配。當參與匹配的模式串部分K大於1時,從x+1到x + L開始的匹配都是無意義的,因爲如果能夠再次匹配到k這個位置,則證明週期串不是最小的,這與週期串的定義矛盾。因此在模式串的第j位與正文串的第k位匹配失敗後,直接將模式串後移L位,正文串第k+1位開始與模式串j-L位開始比較就可以了,這樣,正文串中的每個字符在算法中,只參與一次比較,算法的時間串行時間複雜度爲線性。
KMP算法的關鍵是要計算一個next數組,在這裏有詳細講解:https://www.cnblogs.com/yjiyjige/p/3263858.html
也有的地方叫做失效函數,今天看書的時候有點看不懂,看完了寫了一點筆記,抄錄上來以便日後查閱
輸入:模式串P[1 : m]
輸出:失效函數F(k), 1 ≤ k ≤ m + 1
Begin
F(1) = 0
F(2) = 1 //F(2) = j - F(1) = 1 - 0 = 1
k = 2
j = 1
while k ≤ m do //在所有位置F(k)計算完成之前
if P(k) = P(j) then //如圖6.1(2)相等時,k這個位置能與前面匹配上的長度就是j + 1
j = j + 1
k + k + 1
F(k) = j
endif
if P(k) ≠ P(j) then //不相等時,將j移動一個週期串長度(j = F(j)),繼續匹配
//如果一直匹配不到,j最終會變成0,那說明j的週期串加上
//前綴串第一個字符,並不是前面出現的一個週期串,因此j要
//從頭再開始匹配
j = F(j)
if j = 0 then
k = k + 1
j = 1
F(k) = 1
endif
endif
endif
endwhile
End