Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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 如何在字符串中找到最长的连续重复子字符串?_Java_String_Longest Substring - Fatal编程技术网

Java 如何在字符串中找到最长的连续重复子字符串?

Java 如何在字符串中找到最长的连续重复子字符串?,java,string,longest-substring,Java,String,Longest Substring,为了解密邮件,我需要首先找到密钥。根据给定的信息,我发现键是字符串的一部分: str=“25122825122082” 我们可以很容易地得到密钥应该是“2512208”,因为密钥应该在加密消息时重复使用。然而,我尝试了许多方法,得到了答案“25122082”,最后又增加了2个,但这只是钥匙的另一个开始 我尝试过的方法是: 正则表达式:String repeated=str.replaceAll(“(.+?)\\1+”,“$1”) 这两者提供了相同的答案(“25122082”) 有人能帮我解决这

为了解密邮件,我需要首先找到密钥。根据给定的信息,我发现键是字符串的一部分:

str=“25122825122082”

我们可以很容易地得到密钥应该是“
2512208
”,因为密钥应该在加密消息时重复使用。然而,我尝试了许多方法,得到了答案“
25122082
”,最后又增加了2个,但这只是钥匙的另一个开始

我尝试过的方法是:

  • 正则表达式:
    String repeated=str.replaceAll(“(.+?)\\1+”,“$1”)
  • 这两者提供了相同的答案(“
    25122082
    ”)

    有人能帮我解决这个问题吗


    谢谢大家!

    感谢@ajb,通过使用find()和group()解决了这个问题


    输出:2512208

    可能的重复:
    replaceAll
    正在做它应该做的事情:它将25122082512208替换为2512208。字符串的末尾仍然有一个“2”,它不会替换它。在这里,由于您试图从字符串中提取信息,
    replaceAll
    对于作业来说是错误的工具。使用
    find
    搜索正则表达式,使用
    group
    提取捕获组
    replaceAll
    用于用其他字符串替换输入字符串的一部分,而不使用输入字符串的其余部分。这不是你想做的。你怎么确定2512208是钥匙而不是25122082?@TimBiegeleisen不重复,用这种方法我无法得到正确的答案。即使使用这个在线演示,我也不能得到正确的答案@NickZiebert,因为钥匙重复了。如果25122082是关键,那么重复模式是什么?如果密钥长度不足以加密消息,它应该从一开始就返回。我的意思是,您可以说
    m.group(1)
    ,以获取第一个组的内容(这意味着与正则表达式中的
    \\1
    或替换字符串中的
    $1
    相同)
    m.group()。在此之后,您不需要再进行一次
    replaceAll
    。谢谢!但是如果键是“5122082”,我怎么找到它呢?如果输入字符串是上面的
    str
    ,并且“最长的连续重复子字符串”是键,那么它是不明确的。2512208和5122082均符合标准,且长度相同。如果您有一条规则可以清楚地表明5122082是键(例如,在平局的情况下选择文件中的最后一个子字符串),那么可能有一种方法可以调整代码以遵循该规则。如果没有规则,那么就没有解决方案——无法在两者之间做出决定。这种方法只能得到“第一个重复字符串”。对于
    str=“2251220825122082”
    ,这种方法得到4次“2”,而不是正确答案“25122082”
        String str = "251220825122082";
        Pattern p = Pattern.compile("(.+?)\\1+");
        Matcher m = p.matcher(str);
        while (m.find()) {
            String repeated = m.group(1);
            System.out.println(repeated);
        }