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

Java 如何找到给定字符串的最长重复子字符串,java,string,Java,String,我是新java,我被指派查找字符串的最长子字符串。 我在网上研究,似乎解决这个问题的好方法是实现后缀树。 请让我知道我可以怎么做,或者如果你有任何其他的解决方案。请记住,这应该是在java知识水平较低的情况下完成的 谢谢你 另外,测试仪串令人放心 /** This method will find the longest substring of a given string. String given here is reassuring. */ public String lo

我是新java,我被指派查找字符串的最长子字符串。 我在网上研究,似乎解决这个问题的好方法是实现后缀树。 请让我知道我可以怎么做,或者如果你有任何其他的解决方案。请记住,这应该是在java知识水平较低的情况下完成的

谢谢你

另外,测试仪串令人放心

    /**
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; 
}
/**
此方法将查找给定字符串的最长子字符串。
这里给出的字符串令人放心。
*/
公共字符串longestreatedsubstring()
{
字符串longestrepatedsubstring=“”;

对于(int i=0;i如果您调试代码,您会发现代码没有按照您的想法运行。那么您至少需要三个循环,并且不能假设您只从第一个字符开始。下面是一个可能的解决方案

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;
}
为了“让人放心”,它打印的是我第一次猜测的
r
而不是
s

publicstaticvoidmain(String[]args){
String str=“testingString”;
char[]strArr=str.toCharArray();
StringBuilder bm=新的StringBuilder();
布尔值isPresent=false;
int len=strArr.length;
int初始值=0;
初始值为0;
HashMap hm=新的HashMap();
HashMap hl=新的HashMap();
而(首字母=len-1)){
如果(!hm.isEmpty()){
isPresent=hm.containsValue(strArr[初始]+“”);
如果(!isPresent){
bm.append(strArr[首字母]);
hm.put(strArr[initial]+“”,strArr[initial]+“”);
如果(初始==len-1){
System.out.println(“最长子字符串为::”+bm);
打破
}
}
如果出现,则为else(当前){
System.out.println(“最长子字符串为::”+bm);
bm.delete(0,bm.length());
++初级的;
首字母--;
hm.clear();
}
初始++;
}
其他的
{
bm.append(strArr[首字母]);
hm.put(strArr[initial]+“”,strArr[initial]+“”);
初始++;
}
}
hm.clear();
}

我刚刚进行了研究,希望找到一个替代解决方案。我正在考虑使用两个for循环,多个循环将获得字符串的各种子字符串,另一个循环将查看它是否在字符串的其余部分找到该子字符串的副本。我不是在寻求解决方案。我是在寻求更好的方法,因为后缀树l更高层次的javaprogramming@DfsdfsdfDsfsdfdsf向我们展示您到目前为止所做的尝试。这样我们就可以帮助您:)使用一些for循环来尝试每个可能的子字符串,或者甚至使用正则表达式。这不是最有效的解决方案,但对于短字符串来说也可以。对于“qwqwabcabc”,返回“qw”而不是“abc”外部是什么:?这是一个java概念吗?我知道它在做什么,但不知道它将涉及什么主题be@RishabhAgarwal它是一个循环的标签,允许你继续一个外部循环。@PeterLawreyThanks@PeterLawrey我知道它的老帖子。但我认为它可以通过两个循环来完成(蛮力算法)另外,对于每个字符,运行索引大于外循环的内循环。如果匹配,只需按顺序比较每个字符(使用
++
运算符,直到我们得到匹配),直到它为正。我知道它的高级算法,将在get time:)后实现。突然出现了一个想法。
abcaab
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();
    }