以此字符串为例子:
i : 0 1 2 3 4 5 6 7
a b a b a c d
-1 0 0 1 2 3 0 0
我一般求Next数组时都会求到实际最后一个字符的下一位,因为循环节的相关题目会用的到。
1.“Next数组”中第i位表示在与母串发生失配时应该跳转到的用来比较的那一位;
2.“Next数组”中第i位可以表示以第i-1位为结尾的后缀串的长度;
引申:最后一位的下一位的值可以表示最后一位为结尾的后缀串是否存在(0即不存在),并且能知道串有多长;当不断从第i位跳到第Next[i]位并取当前位置的Next数组的值的时候,可以不停地找到与后缀相匹配的子字符串(子字符串的后缀子字符串必定是子字符串的后缀),并且可以求出有多少个可以与最后一位为结尾的后缀相匹配和他们的长度。
3.“Next数组”求循环节相关内容:
(1)求循环节长度:Next[i]表示的是第i位失配时应跳转的位置,也可以表示第i-1位为结尾的后缀串长度,那么如果能跳转,i-1就可以用来表示循环节最后出现的位置,而且Next[i]-1就可以表示上一次出现的位置,做差就可以求出循环节长度,表示为i-Next[i];
(2)求循环次数:有了循环节长度,那么就可以进行循环次数的求解,0~i-1共有i个字符,i / (i - Next[i])就是循环次数。
(3)循环判定:如果第i-1位为结尾的循环必定有 i % (i - Next[i]) == 0 .
1万+

被折叠的 条评论
为什么被折叠?



