以一个题为例:
计算上图中 next[ j ] 以及 nextval[ j ] 的值。
【 本文中 j 的下标从1开始。】
最长公共前后缀:
···前缀:不包含最后一个字符的所有以第一个字符开头的连续子串。
···后缀:不包含第一个字符的所有以最后一个字符结尾的连续子串。
先看next[ j ],
(1)j 的下标为1 与 2 时,next[ j ]的值默认为 0 和 1 。
(2)j的下标为 3 时,模式串的值为 a 。由于next[3]前面的next[1] 与next[2]的值分别为 a 和 b 。因此没有最大公共前后缀。所以next[3] 的值为 0+1=1。
(3)j的下标为4时,模式串的值为 b 。next[4] 的最大公共前后缀为a。因此,next[4] 的值为1+1=2。
(4)j 的下标为5时,模式串的值为 a 。next[5] 的最大公共前后缀为 a b 。因此,next[5]的值为2+1=3。
(5)j的下标为6时,模式串的值为 a 。next[6]的最大公共前后缀为 a b a 。因此,next[6] 的值为3+1=4。
(6)j的下标为7时,模式串的值为 a 。next[7]的最大公共前后缀为 a 。因此,next[7] 的值为1+1=2。
以此类推,完整的next[ j ] 的值为:
再看nextval[ j ],
(1)j 的下标为1时,next[ j ]的值默认为 0 。
(2)j的下标为 2 时,模式串的值为 b ,next[2] 的值为 1 。因此,j 的下标为 1 时,模式串的值为 a 。a 与 b 不相等,把next[2] 的值下移。因此,nextval[2] 的值为1。
(3)j的下标为 3 时,模式串的值为 a ,next[3] 的值为 1 。因此,j 的下标为 1 时,模式串的值为 a 。a 与 a 相等,把nextval[1] 的值移到netval[3]。因此,nextval[3] 的值为0。
(4)j的下标为 4 时,模式串的值为 b ,next[4] 的值为 2 。因此,j 的下标为 2 时,模式串的值为 b 。b 与 b 相等,把nextval[2] 的值移到netval[4]。因此,nextval[4] 的值为1。
(5)j的下标为 5 时,模式串的值为 a ,next[5] 的值为 3 。因此,j 的下标为 3 时,模式串的值为 a 。b 与 b 相等,把nextval[3] 的值移到netval[5]。因此,nextval[5] 的值为0。
以此类推,完整的nextval[ j ] 的值为:
以上就是KMP算法中next数组以及nextval的求解过程。
标签:下标,因此,nextval,后缀,模式,next,KMP From: https://blog.csdn.net/2401_82456039/article/details/140639888