一. BF算法 算法
BF算法是普通的模式匹配算法,BF算法的思想就是將目標串S的第一個字符與模式串P的第一個字符進行匹配,若相等,則繼續比較S的第二個字符和P的第二個字符;若不相等,則比較S的第二個字符和P的第一個字符,依次比較下去,直到得出最後的匹配結果。 數組
舉例說明: S: ababcababa P: ababa .net
BF算法匹配的步驟以下: 指針
代碼實現: get
其實在上面的匹配過程當中,有不少比較是多餘的。在第五趟匹配失敗的時候,在第六趟,i能夠保持不變,j值爲2。由於在前面匹配的過程當中,對於串S,已知s0s1s2s3=p0p1p2p3,又由於p0!=p1!,因此第六趟的匹配是多餘的。又因爲p0==p2,p1==p3,因此第七趟和第八趟的匹配也是多餘的。在KMP算法中就省略了這些多餘的匹配。 it
二. KMP算法 im
KMP算法之因此叫作KMP算法是由於這個算法是由三我的共同提出來的,就取三我的名字的首字母做爲該算法的名字。其實KMP算法與BF算法的區別就在於KMP算法巧妙的消除了指針i的回溯問題,只需肯定下次匹配j的位置便可,使得問題的複雜度由O(mn)降低到O(m+n)。 next
在KMP算法中,爲了肯定在匹配不成功時,下次匹配時j的位置,引入了next[]數組,next[j]的值表示P[0...j-1]中最長後綴的長度等於相同字符序列的前綴。 static
對於next[]數組的定義以下: img
1)next[j]=-1 j=0
2)next[j]=max k:0<k<j P[0...k-1]=P[j-k,j-1]
3)next[j]=0 其餘
如:
P a b a b a
j 0 1 2 3 4
next -1 0 0 1 2
即next[j]=k>0時,表示P[0...k-1]=P[j-k,j-1]
所以KMP算法的思想就是:在匹配過程當中,若發生不匹配的狀況,若是next[j]>=0,則目標串的指針i不變,將模式串的指針j移動到next[j]的位置繼續進行匹配;若next[j]=-1,則將i右移1位,並將j置0,繼續進行比較。
代碼實現以下:
所以KMP算法的關鍵在於求算next[]數組的值,即求算模式串每一個位置處的最長後綴與前綴相同的長度, 而求算next[]數組的一種思路是用遞推的思想去求算: