Java 是否可以将Boyer-Moore算法更改为搜索;全文;只有
我编写了一个Java函数,它实现了Boyer-Moore算法来搜索字符数组中的给定子字符串。它返回数组中找到子字符串的每个索引的列表。例如,如果正在搜索的char数组包含短语“行尸走肉”,并且作为参数提供的子字符串是“king”,则将返回一个大小为1的列表,其中包含值7 我想更改此函数,以便只返回char数组中的完整字的子字符串索引。因此,前面的示例将返回一个空列表,但如果子字符串更改为“the”、“Walking”或“Dead”,则大小为1的列表将分别返回值0、4和12Java 是否可以将Boyer-Moore算法更改为搜索;全文;只有,java,string,search,words,boyer-moore,Java,String,Search,Words,Boyer Moore,我编写了一个Java函数,它实现了Boyer-Moore算法来搜索字符数组中的给定子字符串。它返回数组中找到子字符串的每个索引的列表。例如,如果正在搜索的char数组包含短语“行尸走肉”,并且作为参数提供的子字符串是“king”,则将返回一个大小为1的列表,其中包含值7 我想更改此函数,以便只返回char数组中的完整字的子字符串索引。因此,前面的示例将返回一个空列表,但如果子字符串更改为“the”、“Walking”或“Dead”,则大小为1的列表将分别返回值0、4和12 使用Boyer-Moo
使用Boyer-Moore算法可以实现这种功能吗?是否有其他字符串搜索算法能够高效地生成这些结果?这可能不是您想要的答案,但您可以更改参数而不是算法:在搜索字符串的开头和结尾以及目标字符串的开头和结尾添加空格(以防第一个或最后一个词被击中)。
你还需要特别对待标点符号和其他非单词字符。是的,你可以调整Boyer Moore来做到这一点:
- 在每次“匹配”之后,您可以检查匹配的开始和结束位置是否位于单词边界
- 将搜索从“king”更改为“word boundary+“king”+word boundary”,其中“word boundary”是一个伪字符,修改后的B-M与任何单词边界字符匹配
- 您可以对输入进行预处理,用表示“单词边界”的特殊字符替换所有空格、标点符号等,然后进行搜索
Pattern pattern = Pattern.compile("\\b" + Pattern.quote(needle) + "\\b");
Matcher m = pattern.matcher(haystack);
while (m.find()) {
System.out.println(m.start());
}
如果您使用当前的算法在“+”行尸走肉“+”
中搜索“
”,您可能已经有了一个完整的单词搜索。