在Java中搜索子字符串中的String的最快方法?

时间:2018-02-12 19:47:18

标签: java string substring

目前我正在研究Kattis问题,“字符串匹配”(https://open.kattis.com/problems/stringmatching)。我正在为我的程序获得正确的输出,但是由于文件太大,并且完成问题的时间限制是2秒,我在Kattis上不断出现“超出时间限制”错误。我尝试了两种解决问题的方法,第二种测试用例超出了我的时间限制。这就是我所做的:

    while (sc.hasNext()) {

        String pattern = sc.nextLine();
        String text = sc.nextLine();

        for(int i = 0; i < text.length()-pattern.length()+1; i++) {
            if(text.regionMatches(i,  pattern, 0, pattern.length())) {
                System.out.print(i + " ");
            }
        }
        System.out.println();
    }

我也是这样试过的:

    while(sc.hasNext()) {

        String pattern = sc.nextLine();
        String text = sc.nextLine();

        for(int i = 0; i < text.length()-pattern.length()+1; i++) {
            if(pattern.equals(text.substring(i, i+pattern.length()))) {
                System.out.print(i + " ");
            }
        }   
    System.out.println();
}

获取字符串并对其进行比较以查看它是否存在于更大的字符串中更快捷的方法是什么?

2 个答案:

答案 0 :(得分:0)

根据您对获得职位的评论,使用正则表达式匹配器非常简单。见下文:

Pattern p = Pattern.compile("your regex pattern here");
Matcher m = p.matcher("the string you're testing");
if (m.find()) {
    int start = m.start();
    int end = m.end();

    // do something
}

编辑:下面的一个工作示例。

public static void main(String...args) throws Exception {
    printMatchInfo("\\w+", "The quick brown fox jumps over the lazy dog");
}

private static void printMatchInfo(String regex, String input) {
    Pattern p = Pattern.compile(regex);
    Matcher m = p.matcher(input);
    System.out.println(String.format("Checking %s against %s", input, regex)); 
    while (m.find()) {
        System.out.println(String.format("Found %s with (start, end) (%d, %d)", m.group(), m.start(), m.end()));
    }
}

输出

Checking The quick brown fox jumps over the lazy dog against \w+
Found The with (start, end) (0, 3)
Found quick with (start, end) (4, 9)
Found brown with (start, end) (10, 15)

...

答案 1 :(得分:0)

针对大量数据的最快解决方案将提供Suffix TreeSuffix Array

后缀树的天真实现非常简单,您可以在此处查看我的解决方案:https://github.com/sergpank/lcs/blob/master/src/MonoMain.java

如果您需要更快地构建后缀树,请尝试使用Ukkonen Algorythm或任何其他高级数据结构。