如何找到给定字符串的最长重复子字符串

时间:2012-11-03 18:27:58

标签: java string

我是新的java并且我被赋予了分配以找到字符串的最长子字符串。 我在网上研究,看来解决这个问题的好方法是实现后缀树。 请告诉我如何做到这一点,或者如果您有任何其他解决方案。请记住,这是假设用低水平的java知识完成的。

谢谢你。

P.S。测试仪字符串让人放心。

    /**
This method will find the longest substring of a given string.
String given here is reassuring. 

 */
public String longestRepeatedSubstring()
{
    String longestRepeatedSubstring = "";
    for (int i = 0; i<text.length(); i++ )
    {
        String one = text.substring(0,i); 

        for(int o = 0; o<text.length();o++)
        {
            Sting two = text.substring(0,o);
            if(one.equals(two))
            {
                longestRepeatedSubstring = one;
            }

        }

    }
    return longestRepeatedSubstring; 
}

2 个答案:

答案 0 :(得分:2)

如果您调试代码,您将看到代码没有按照您的想法进行操作。 AFAIK你需要至少三个循环,你不能假设你只会从第一个角色开始。这是一种可能的解决方案。

public static void main(String[] args) throws IOException {
    String longest = longestDuplicate("ababcaabcabcaab");
    System.out.println(longest);
}

public static String longestDuplicate(String text) {
    String longest = "";
    for (int i = 0; i < text.length() - 2 * longest.length() * 2; i++) {
        OUTER:
        for (int j = longest.length() + 1; j * 2 < text.length() - i; j++) {
            String find = text.substring(i, i + j);
            for (int k = i + j; k <= text.length() - j; k++) {
                if (text.substring(k, k + j).equals(find)) {
                    longest = find;
                    continue OUTER;
                }
            }
            break;
        }
    }
    return longest;
}

打印

abcaab

为了“让人放心”打印r而不是s,这是我的第一次猜测。 ;)

答案 1 :(得分:0)

public static void main(String[] args) {
        String str = "testingString";
        char[] strArr = str.toCharArray();
        StringBuilder bm = new StringBuilder();
        boolean isPresent = false;
        int len = strArr.length;
        int initial =0;
        int dinitial=0;

        HashMap<String, String> hm = new HashMap<String,String>();
        HashMap<String, String> hl = new HashMap<String,String>();
        while(initial<=len-1 && !(dinitial>=len-1)){
            if(!hm.isEmpty()){
                isPresent = hm.containsValue(strArr[initial]+"");
                if(!isPresent){
                    bm.append(strArr[initial]);
                    hm.put(strArr[initial]+"",strArr[initial]+"");
                    if(initial==len-1){
                        System.out.println("Longest substring is::" + bm);
                        break;
                    }
                }
                else if(isPresent){
                    System.out.println("Longest substring is::" + bm);
                    bm.delete(0, bm.length());
                    ++dinitial;
                    initial--;
                    hm.clear();
                }
                initial++;
            }
            else
            {
                    bm.append(strArr[initial]);
                    hm.put(strArr[initial]+"",strArr[initial]+"");
                    initial++;
            }
        }
        hm.clear();
    }