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