Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/308.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否可以将Boyer-Moore算法更改为搜索;全文;只有_Java_String_Search_Words_Boyer Moore - Fatal编程技术网

Java 是否可以将Boyer-Moore算法更改为搜索;全文;只有

Java 是否可以将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

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

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


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

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

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

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

  • 将搜索从“king”更改为“word boundary+“king”+word boundary”,其中“word boundary”是一个伪字符,修改后的B-M与任何单词边界字符匹配

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

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

只需使用Java,它已经在内部实现了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());
    }
如果您使用当前的算法在
“+”行尸走肉“+”
中搜索
”,您可能已经有了一个完整的单词搜索。