查找字符串中最长的重复子字符串所需的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

需要java函数来查找字符串中最长的重复子字符串

例如,如果输入是“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(); 
}