首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否可以将Boyer-Moore算法修改为仅搜索“完整单词”?

是否可以将Boyer-Moore算法修改为仅搜索“完整单词”?
EN

Stack Overflow用户
提问于 2012-11-17 11:02:47
回答 3查看 584关注 0票数 0

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

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

这种功能可以使用Boyer-Moore算法实现吗?有没有其他的字符串搜索算法能够高效地产生这些结果?

EN

回答 3

Stack Overflow用户

发布于 2012-11-17 11:17:41

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

票数 2
EN

Stack Overflow用户

发布于 2012-11-17 11:59:05

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

单词边界每次“匹配”后,您可以检查匹配的开始和结束位置是否在单词边界将搜索从“”更改为“word -

  • + "king”+word- boundaries.
  • You“,其中”word-
  • “是一个伪字符,您的修改后的B-M将其与任何单词边界字符进行匹配。
  • 您可以对输入进行预处理,将所有空格、标点符号等替换为表示”单词边界“的特殊字符,然后进行搜索。

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

票数 0
EN

Stack Overflow用户

发布于 2013-11-23 16:19:51

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

代码语言:javascript
复制
    Pattern pattern = Pattern.compile("\\b" + Pattern.quote(needle) + "\\b");
    Matcher m = pattern.matcher(haystack);
    while (m.find()) {
        System.out.println(m.start());
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/13427245

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档