博住看大话数据结构里的Next数组求法,看的云里雾里。看了大量帖子,然后根据网上帖子,以大话数据结构的思路,总结出Next数组的求法。
如有错误请指正。
先明确什么是部分匹配值?"部分匹配值"就是"前缀"和"后缀"的最长的共有元素的长度。
以"ABCDABD"为例,
- "A"的前缀和后缀都为空集,共有元素的长度为0;
- "AB"的前缀为[A],后缀为[B],共有元素的长度为0;
- "ABC"的前缀为[A, AB],后缀为[BC, C],共有元素的长度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。
知道了什么事部分匹配值后,再来看 大话数据结构伤的例子。
注意 这里的 j 从 1开始
j 1 2 3 4 5 6
串 a b c a b x
next[j] 0 1 1 1 2 3
当 j =1时,next[1]=0; 这是初始定义。
当 j=2时:实际上是判断第(2-1)个位置的串的部分匹配值。这里也就是第1个(a)串部分匹配值,大话数据结构里定义的无相同前后缀,则next[ j ]的值就为 1。明显一个元素哪来的前后缀嘛。所以就为1( 网上也有说next[ j ]的值就是第(j-1)串的部分匹配值 加 1 ,这样理解也正确)。
当 j=3时:实际上是判断第(3-1)个位置的串的部分匹配值。这里也就是第2个的串(ab)部分匹配值为0,也就是无相同前后缀, 所以值是1。
当j=4时:实际上是判断第(4-1)个位置的串的部分匹配值。这里也就是第3个的串(abc)部分匹配值为0,无相同前后缀,所以值是1。
当j=5时:实际上是判断第(5-1)个位置的串的部分匹配值。这里也就是第4个的串(abca)部分匹配值1,next[5]的值是2。这个2是怎么来的是需要注意的,大话数据结构的定义是,如果前后缀的一个字符相等,值就是2,两个字符相等,值就是3,所以n个相等的值,就是n+1,也就是部分匹配值加1。( 网上也有说next[ j ]的值就是第(j-1)串的部分匹配值 加 1 ,这样理解也正确)
当j=6时:实际上是判断第(6-1)个位置的串的部分匹配值。这里也就是第4个的串(abcab)部分匹配值2,next[6]是3。
总结完毕,收工。