求解KMP算法及next值
KMP算法的关键是理解和求出 next[i] 值。有如下两串,S为母串、P为子串;
↓i
s (1) …… s (i-j+1)…s (i-j+k-1) …s (i-k+1) … s (i-1) s
(i)
p (1) … p (k-1) … p (j-k+1) … p (j-1) p (j)
↑j
其中s(i) != p(j) 但有如下序列匹配:
s(i-j+1)…… s(i-1) = p(1) ……p(j-1) p(j)
当子串自身中存在 p(1) p(2)… p(k-1) = p(j-k+1) p(j-k+2)… p
(j-1)
也就是说 p (1) p (2)… p (k-1)
= s(i-k+1)…… s(i-1)
以一个事例解释下:
比如字符串: abaabaaa
a next[1] = 0
ab next[2] = 1
aba next[3] = 1
abaa next[4] = 2
abaab next[5] = 2
abaaba next[6] = 3
abaabaa next[7] = 4
abaabaaa next[8] = 5
咋求next值呢?这里再详细叙述下,拿上面的最后一个为例。因为你要求next[8],所以我们只看前七位。看看他们的匹配过程(自身模式串的匹配)
aba abaa a(不匹配字符用红色标出,最后的字符不看)
a b aab a不匹配
aba ab 不匹配
abaa 匹配
ab a
ab
a 匹配(但他不是最大的字符匹配 )
注意:其实从第4个开始就不用在匹配了,为了说明期间我还是写出来了。希望有助于理解。
于是自身中存在一个四字符的子序列与自身匹配,所以他的next[8]值为4+1=5
下面是next值的函数(注意是改进算法,之间将程序最里程的if..else语句修改下,就是普通的next函数了),可以打印出结果看是不是和你笔算的一样 ^⊥^
KMP算法的关键是理解和求出 next[i] 值。有如下两串,S为母串、P为子串;
↓i
s
p
↑j
其中s(i) != p(j) 但有如下序列匹配:
当子串自身中存在
也就是说 p
以一个事例解释下:
比如字符串: abaabaaa
a next[1] = 0
ab next[2] = 1
aba next[3] = 1
abaa next[4] = 2
abaab next[5] = 2
abaaba next[6] = 3
abaabaa next[7] = 4
abaabaaa next[8] = 5
咋求next值呢?这里再详细叙述下,拿上面的最后一个为例。因为你要求next[8],所以我们只看前七位。看看他们的匹配过程(自身模式串的匹配)
aba
a
aba
ab
ab
a 匹配(但他不是最大的字符匹配
注意:其实从第4个开始就不用在匹配了,为了说明期间我还是写出来了。希望有助于理解。
于是自身中存在一个四字符的子序列与自身匹配,所以他的next[8]值为4+1=5
下面是next值的函数(注意是改进算法,之间将程序最里程的if..else语句修改下,就是普通的next函数了),可以打印出结果看是不是和你笔算的一样 ^⊥^