【问题标题】:Can the Boyer-Moore algorithm be altered to search for "full words" only?可以将 Boyer-Moore 算法更改为仅搜索“完整单词”吗?
【发布时间】:2012-11-17 03:02:47
【问题描述】:

我编写了一个 Java 函数,它实现了 Boyer-Moore 算法来搜索 char 数组中的给定子字符串。它返回在数组中找到子字符串的每个索引的列表。例如,如果正在搜索的 char 数组包含短语“行尸走肉”并且作为参数给出的子字符串是“king”,则将返回包含值 7 的大小为 1 的列表。

我想更改此函数,以便仅返回 char 数组中完整单词的子字符串的索引。因此,前面的示例将返回一个空列表,但如果子字符串更改为“The”、“Walking”或“Dead”,则大小为 1 的列表将分别返回值 0、4 和 12。

这种功能是否可以使用 Boyer-Moore 算法来实现?是否有任何其他字符串搜索算法能够有效地产生这些结果?

【问题讨论】:

  • 如果您使用当前算法在" " + "The Walking Dead" + " " 中搜索" The ",您已经进行了完整的单词搜索。

标签: java string search words boyer-moore


【解决方案1】:

这可能不是您想要的答案,但您可以更改参数而不是算法:在搜索字符串的开头和结尾以及目标字符串的开头和结尾添加空格(如果第一个或最后一个词是命中)。 您还需要对标点符号和其他非单词字符进行特殊处理。

【讨论】:

    【解决方案2】:

    是的,您可以调整 Boyer-Moore 来做到这一点:

    • 在每次“匹配”之后,您可以检查匹配的开始和结束位置是否在单词边界处。

    • 您将搜索从 "king" 更改为 'word-boundary + "king" + word-boundary' 其中 'word-boundary' 是一个伪字符,您修改后的 BM 与任何单词边界字符匹配.

    • 您可以预处理输入以将所有空格、标点符号等替换为表示“单词边界”的特殊字符,然后进行搜索。

    其中哪一个可能更好取决于您如何实现它们......以及您是否要重复搜索相同的输入文本。

    【讨论】:

      【解决方案3】:

      只需使用 Java 的 Pattern - 它已经在内部实现了 Boyer Moore。然后 '\b' 匹配一个单词边界。如:

          Pattern pattern = Pattern.compile("\\b" + Pattern.quote(needle) + "\\b");
          Matcher m = pattern.matcher(haystack);
          while (m.find()) {
              System.out.println(m.start());
          }
      

      【讨论】:

        猜你喜欢
        • 2010-10-28
        • 2012-07-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多