首先得理解前綴和後綴的概念:算法
部分匹配值就是前綴和後綴的最長的共有元素的長度.以ABCDABD爲例數組
A的前綴和後綴都爲空集,共有元素的長度爲0,spa
AB的前綴爲[A],後綴爲[B],共有元素的長度爲0.net
ABC的前綴爲[A,AB]後綴爲[B,BC]共有的元素的長度爲0orm
ABCD的前綴爲[A,AB,ABC],後綴爲[BCD,CD,D],共有元素的長度爲0blog
ABCDA的前綴爲[A,AB,ABC,ABCD]後綴爲[BCDA,CDA,DA,A],共有元素中長度最長的爲A,長度爲1ci
ABCDAB的前綴爲[A,AB,ABC,ABCD,ABCDA],後綴爲[BCDAB,CDAB,DAB,AB,B],共有元素中長度最長的爲AB,長度爲2字符串
ABCDABD的前綴爲[A,AB,ABC,ABCD,ABCDA,ABCDAB],後綴爲[BCDABD,CDABD,DABD,ABD,BD,D],共有元素的長度爲0get
在KMP算法中有個數組,叫作前綴數組,也有的叫next數組,每個子串有一個固定的next數組,它記錄着字符串匹配過程當中失配狀況下能夠向前多跳幾個字符,固然它描述的也是子串的對稱程度,程度越高,值越大,固然以前可能出現再匹配的機會就更大。it
現有以字符串S對於next[]數組的定義以下:
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 其餘
則 A B C D A B D
j 0 1 2 3 4 5 6
next[j] -1 0 0 0 0 1 2
好比說D以前的子串是ABCDAB
該子串的前綴是[A,AB,ABC,ABCD,ABCDA],後綴是[BCDAB,CDAB,DAB,AB,B]
共有元素中長度最長的就是AB,長度爲2,那麼next[6] = 2;
也就是說在D不匹配的時候須要的移動位數知足
移動位數 = 已匹配的字符數 - 對應的部分匹配值
假設到D出現了不匹配的狀況,則已匹配的字符數爲6,next[6] = 2,所需移動位數爲6-2 = 4!
kmp算法中主要是對next數組的求值
相似abcabc這種的next值就比較高,而像abccba這種就比較低
這篇文章寫的至關到位,我都是看這以後才明白的: