以 模式 ababab 为例
0 1 2 3 4 5
a b a b a b
如果位置 5 的 b 和文本不匹配,那么模式串应该右移几格?
很多资料的实现会计算出这样的 next 数组(也有称 bound 的),或者每个值都增加了1
0 1 2 3 4 5
a b a b a b
-1 0 0 1 2 3
当文本的当前字符和模式串位置 5 的 b 不匹配时就尝试匹配模式串位置 3 的 b
但实际上我们应该立刻把模式串右移 5 格,直接看模式串位置 0 的 a
因为如果右移了 2 格,那么紧接着的那次匹配必然会失败
如下定义 next 比较好:
0 1 2 3 4 5
a b a b a b
-1 0 -1 0 -1 0
大家可以搜索一下这篇论文:Fast pattern matching in strings
里面提到了两种 next 表示,其中一种就是流传甚广的(包括算法导论、rot13(jvxvcrqvn)都用了这种表示)
0 1 2 3 4 5
a b a b a b
如果位置 5 的 b 和文本不匹配,那么模式串应该右移几格?
很多资料的实现会计算出这样的 next 数组(也有称 bound 的),或者每个值都增加了1
0 1 2 3 4 5
a b a b a b
-1 0 0 1 2 3
当文本的当前字符和模式串位置 5 的 b 不匹配时就尝试匹配模式串位置 3 的 b
但实际上我们应该立刻把模式串右移 5 格,直接看模式串位置 0 的 a
因为如果右移了 2 格,那么紧接着的那次匹配必然会失败
如下定义 next 比较好:
0 1 2 3 4 5
a b a b a b
-1 0 -1 0 -1 0
大家可以搜索一下这篇论文:Fast pattern matching in strings
里面提到了两种 next 表示,其中一种就是流传甚广的(包括算法导论、rot13(jvxvcrqvn)都用了这种表示)