【发布时间】:2016-07-05 15:04:56
【问题描述】:
当我了解Galil Rule 时,我正在实现Boyer-Moore Algorithm 以在Python 中进行子字符串搜索。我在网上四处寻找加利尔规则,但除了几句话外,我没有找到任何东西,而且我无法访问原始论文。如何在我当前的算法中实现这一点?
i = 0
while i < (N - M + 1):
skip = 0
for j in reversed(range(0, M)):
if pattern[j] != text[i + j]:
skip = max(1, j - offsets[text[i+j]])
break
if skip == 0:
return i
i += skip
return -1
注意事项:
- offsets[c] = -1 如果 c 不在模式中
- offsets[c] = 模式中 c 的最后一个索引
示例: aaabcb
- 偏移量[a] = 2
- 偏移量[b] = 5
- 偏移量[c] = 4
- 偏移量[d] = -1
我发现的几句话说要跟踪我的内部循环中第一次不匹配发生的时间(j,如果内部循环中的 if 语句为 True)以及我开始比较的位置(i + j,就我而言)。我理解我已经检查了它们之间的所有索引的直觉,所以我不应该再次进行这些比较。我只是不明白如何连接这些点并实现一个实现。
【问题讨论】: