首先得理解前缀和后缀的概念:
部分匹配值就是前缀和后缀的最长的共有元素的长度.以ABCDABD为例
A的前缀和后缀都为空集,共有元素的长度为0,
AB的前缀为[A],后缀为[B],共有元素的长度为0
ABC的前缀为[A,AB]后缀为[B,BC]共有的元素的长度为0
ABCD的前缀为[A,AB,ABC],后缀为[BCD,CD,D],共有元素的长度为0
ABCDA的前缀为[A,AB,ABC,ABCD]后缀为[BCDA,CDA,DA,A],共有元素中长度最长的为A,长度为1
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],共有元素的长度为0
在KMP算法中有个数组,叫做前缀数组,也有的叫next数组,每一个子串有一个固定的next数组,它记录着字符串匹配过程中失配情况下可以向前多跳几个字符,当然它描述的也是子串的对称程度,程度越高,值越大,当然之前可能出现再匹配的机会就更大。
现有以字符串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这种就比较低
这篇文章写的相当到位,我都是看这之后才明白的:
http://blog.csdn.net/yearn520/article/details/6729426