求next数组(也就是卡到这个下标的位置的时候让模式串向后移动多少位)
//要找最大前缀后缀匹配值
a b a a b c
0 1 1 2 2 3
求nextval数组
nextval数组是在next数组缺陷的情况下提出的,例如:模式“aaaab”在和主串"aaabaaaab"匹配时,当i=4,j=4时s.ch[i]!=T.ch[j],由于next[j]=3的指示,会模式串右滑一位进行i=4,j=3的比较,接着有根据next数组的指示会进行i=4,j=2,i=4,j=1的比较。实际上,因为模式串1~3个字符和第四个字符都相等,因此不需要再和主串中第第四个字符比较,而可以将模式串连续向右滑4个字符的位置直接进行i=5,j=1的比较。
因为next存在上述的问题,所以提出了next数组的修改值——nextval数组,
1.设主串 T = abaabaabcabaabc
,模式串 S = abaabc
,采用 KMP 算法进行模式匹配,到匹配成功时为止,在匹配过程中进行的单个字符间的比较次数是:10
//先比较了5次,到了c之后,向后移动3位,之后比较了5次,一共10次
2.串“ababaabab”的nextval为010104101