String indexOf 之BF、KMP算法

一. BF算法 算法

BF算法是普通的模式匹配算法,BF算法的思想就是將目標串S的第一個字符與模式串P的第一個字符進行匹配,若相等,則繼續比較S的第二個字符和P的第二個字符;若不相等,則比較S的第二個字符和P的第一個字符,依次比較下去,直到得出最後的匹配結果數組

舉例說明: S:  ababcababa  P:  ababa .net

BF算法匹配的步驟以下: 指針

image

代碼實現: get

image

其實在上面的匹配過程當中,有不少比較是多餘的。在第五趟匹配失敗的時候,在第六趟,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,繼續進行比較。

代碼實現以下:

image

所以KMP算法的關鍵在於求算next[]數組的值,即求算模式串每一個位置處的最長後綴與前綴相同的長度, 而求算next[]數組的一種思路是用遞推的思想去求算:

image

相關文章
相關標籤/搜索