查找字符串中最长的重复子字符串所需的Java函数?
需要java函数来查找字符串中最长的重复子字符串查找字符串中最长的重复子字符串所需的Java函数?,java,algorithm,Java,Algorithm,需要java函数来查找字符串中最长的重复子字符串 例如,如果输入是“banana”,则输出应该是“ana”,并且我们已经计算了它出现的次数,在本例中为2。 解决方案如下 公共类测试{ 公共静态void main(字符串[]参数){ System.out.println(findLongestSubstring(“我喜欢ike”); System.out.println(findLongestSubstring(“夫人,我是亚当”); System.out.println(findLongestS
例如,如果输入是“banana”,则输出应该是“ana”,并且我们已经计算了它出现的次数,在本例中为2。
解决方案如下
公共类测试{公共静态void main(字符串[]参数){
System.out.println(findLongestSubstring(“我喜欢ike”);
System.out.println(findLongestSubstring(“夫人,我是亚当”);
System.out.println(findLongestSubstring(“当生活递给你柠檬水时,就做柠檬”);
System.out.println(findLongestSubstring(“香蕉”);
}
公共静态字符串findLongestSubstring(字符串值){
String[]strings=新字符串[value.length()];
字符串longestSub=“”;
//去掉一个字符,向数组中添加新字符串
对于(int i=0;i=最长距离){
longestSoFar=卷曲长度;
可能。添加(临时);
}
温度=”;
卷曲长度=0;
}
System.out.println(“可能的最长字符串长度:“+longestSoFar”);
//遍历向量以找到最长的向量
int max=0;
对于(int i=0;imax){
max=possibles.elementAt(i).length();
longestSub=可能的元素(i);
}
}
System.out.println();
//到目前为止都与空白有关
//例如“柠檬”而不是“柠檬”
返回最长分段修剪();
}
}
编辑(为李杰):
从技术上讲,你是正确的——这不是完全相同的问题。然而,这并不能使上面的链接不相关,如果两个字符串都是相同的,则可以使用相同的方法(W.R.T.动态编程)——只需要进行一个修改:不要考虑沿对角线的情况。或者,正如其他人所指出的(例如Lagrandmile),使用后缀树(也可以在上面的链接中找到)
编辑(针对Deepak):
。请注意,您需要修改它以忽略“对角线”(查看Wikipedia图表),否则最长的公共字符串就是它本身
编辑(为李杰):
从技术上讲,你是正确的——这不是完全相同的问题。然而,这并不能使上面的链接不相关,如果两个字符串都是相同的,则可以使用相同的方法(W.R.T.动态编程)——只需要进行一个修改:不要考虑沿对角线的情况。或者,正如其他人所指出的(例如Lagrandmile),使用后缀树(也可以在上面的链接中找到)
编辑(针对Deepak):
。请注意,您需要修改它以忽略“对角线”(查看Wikipedia图表),否则最长的公共字符串就是它本身 在Java中:
多亏了那些找到了解决方法的人,我才不知道。在Java中:
多亏了那些找到解决方法的人,我才不知道。有趣的问题,但你试过什么吗?@khachik,我不知道怎么做proceed@Aix,你有相同的java函数吗?它说使用后缀tree@Deepak如果这是家庭作业,你应该给它贴上这样的标签。有趣的问题,但你试过什么吗?@khachik,我不知道该怎么做proceed@Aix,你有相同的java函数吗?它说使用后缀tree@Deepak如果这是家庭作业,你应该这样标记。问题不是最长的公共子字符串。至少映射不是微不足道的。请注意,这个问题只有一个输入字符串,而LCS问题是在两个输入字符串之间获得最长的公共子字符串。@lijie谢谢你让我保持警惕。我已经更新了答案。@pst,我需要字符串中最长的重复子字符串,您的实现是否将“ana”作为answer@lijie,答案会返回“ana”吗answer@Deepak:是的。然而,它(DP解决方案)并不是可能的最有效算法(即后缀树:O(n))问题不是最长的公共子串。至少映射不是微不足道的。请注意,这个问题只有一个输入字符串,而LCS问题是在两个输入字符串之间获得最长的公共子字符串。@lijie谢谢你让我保持警惕。我已经更新了答案。@pst,我需要字符串中最长的重复子字符串,您的实现是否将“ana”作为answer@lijie,答案会返回“ana”吗answer@Deepak:是的。然而,它(DP解决方案)并不是最有效的算法
public static String findLongestSubstring(String value) {
String[] strings = new String[value.length()];
String longestSub = "";
//strip off a character, add new string to array
for(int i = 0; i < value.length(); i++){
strings[i] = new String(value.substring(i));
}
//debug/visualization
//before sort
for(int i = 0; i < strings.length; i++){
System.out.println(strings[i]);
}
Arrays.sort(strings);
System.out.println();
//debug/visualization
//after sort
for(int i = 0; i < strings.length; i++){
System.out.println(strings[i]);
}
Vector<String> possibles = new Vector<String>();
String temp = "";
int curLength = 0, longestSoFar = 0;
/*
* now that the array is sorted compare the letters
* of the current index to those above, continue until
* you no longer have a match, check length and add
* it to the vector of possibilities
*/
for(int i = 1; i < strings.length; i++){
for(int j = 0; j < strings[i-1].length(); j++){
if (strings[i-1].charAt(j) != strings[i].charAt(j)){
break;
}
else{
temp += strings[i-1].charAt(j);
curLength++;
}
}
//this could alleviate the need for a vector
//since only the first and subsequent longest
//would be added; vector kept for simplicity
if (curLength >= longestSoFar){
longestSoFar = curLength;
possibles.add(temp);
}
temp = "";
curLength = 0;
}
System.out.println("Longest string length from possibles: " + longestSoFar);
//iterate through the vector to find the longest one
int max = 0;
for(int i = 0; i < possibles.size();i++){
//debug/visualization
System.out.println(possibles.elementAt(i));
if (possibles.elementAt(i).length() > max){
max = possibles.elementAt(i).length();
longestSub = possibles.elementAt(i);
}
}
System.out.println();
//concerned with whitespace up until this point
// "lemon" not " lemon" for example
return longestSub.trim();
}