关于 suffix 和 prefix 的判断取值过程,这样可以帮助理解一下
模式串为:cabcab,所以后缀子串有:
后缀子串 长度
b 1
ab 2
cab 3
bcab 4
abcab 5
这些后缀子串都有可能是好后缀{u}!(suffix[k] = j,k{u}是长度,j是在模式串中跟{u}相匹配的{u*}的起始位置)
1. 好后缀是 b => suffix[1] = 2 prefix[1] = false,不是模式串的前缀子串
2. 好后缀是 ab => suffix[2] = 1 prefix[1] = false,不是模式串的前缀子串
3. 好后缀是 cab => suffix[3] = 0 prefix[1] = true,是模式串的前缀子串
4. 好后缀是 bcab => suffix[4] = -1 prefix[1] = false,不是模式串的前缀子串
5. 好后缀是 abcab => suffix[5] = -1 prefix[1] = false,不是模式串的前缀子串
从 1,2,3 中可以看出,如果长度更长的匹配了,前面肯定匹配,因为长度长的包含了长度短的,反之不成立。
这就是结果,然后在看看代码实现:
是从头开始匹配,依次将 b[0, i] 和 b[0,m-1]匹配。
在 while 循环里,依次从后面判断是否匹配,都是先取最后一个来判断,如果匹配就往前,并记录更新位置。如果最后一个都不匹配,那肯定不匹配了
当匹配了 b,就判断 ab是否匹配,接着判断 cab是否匹配... 最后就得到 suffix 和 prefix。
展开