如何在java中从字符串中提取最长的子字符串(具有不同的连续字符)

如何在java中从字符串中提取最长的子字符串(具有不同的连续字符),java,string,Java,String,我想从字符串中提取最长的连续子字符串 例如: 1)abcdeddd 应该给 abcde 2) aaabcdrrr abcd 我写了这段代码 for (int i = 0; i < lines; i++) { String s = bf.readLine(); ArrayList<String> al = new ArrayList<String>(); TreeMap<I

我想从字符串中提取最长的连续子字符串

例如:

1)abcdeddd 应该给

abcde

2) aaabcdrrr

abcd

我写了这段代码

        for (int i = 0; i < lines; i++) {

            String s = bf.readLine();
            ArrayList<String> al = new ArrayList<String>();
            TreeMap<Integer, Integer> count = new TreeMap<Integer, Integer>();
            int point = 0;
            for (int j = 0; j < s.length() - 1; j++) {
                if (s.charAt(j + 1) != s.charAt(j)) {
                    Character xyz = s.charAt(j);
                    String news = al.get(point).concat(xyz.toString());
                    al.add(point, news);

                } else if (s.charAt(j + 1) == s.charAt(j)) {
                    point++;

                }

                for (int k = 0; k < al.size(); k++) {

                    count.put(al.get(k).length(), k);

                }

                System.out.println(al.get(count.get(count.size() - 1)));

            }

        }
    } catch (Exception e) {

    }
}
for(int i=0;i
您可以迭代/检查从字符
x
开始的每个字符,其中x是字符检查的起点,然后递增以检查字符的下一个索引是否对应于最后一个字符的下一个字母表

示例:

String s = "abcdefgdrrstqrstuvwxyzprr";
    int start = s.charAt(0);
    StringBuilder temp = new StringBuilder();
    String temp2 = "";
    boolean done = false;

    for(int i = 0; i < s.toCharArray().length; i++)
    {
        if(s.toCharArray()[i] == start) {
            temp.append(s.toCharArray()[i]);
            start++;
            done = true;
            if(i == s.toCharArray().length-1)
                temp2 = !(temp2.length() > temp.length()) ? temp.toString() : temp2;
        }else
        {
            if(done)
            {
                if(!(temp2.length() > temp.length()))
                    temp2 = temp.toString();
                --i;
            }
            temp = new StringBuilder("");
            done = false;
            start = (i == s.toCharArray().length-1) ? 0 : s.toCharArray()[i+1];
        }
    }

    System.out.println("LONGEST IS: " + temp2);
qrstuvwxyz

如果测试字符串是
abcdeddd
,那么结果将是
abcde

您也可以这样尝试

    String s = "abcdefgdrrstqrstuvwxyzprr";
    Map<Integer,String> results=new HashMap<>();
    Set<String> set=new LinkedHashSet<>();
    for(int i=0;i<s.length()-1;i++){
        if(s.charAt(i)-s.charAt(i+1)==-1){
            set.add(""+s.charAt(i));
            set.add(""+s.charAt(i+1));
        }else {
            results.put(set.size(), set.toString());
            set=new LinkedHashSet<>();
        }
    }
    System.out.println(results);
现在您可以看到所有连续字符。答案是最大的。通过这种方式,如果多个连续子字符串的长度相同,则可以找到多个连续子字符串

你可以得到它

 String largest=new ArrayList<>(results.values())
                               .get(results.size()-1).replaceAll("\\[|]|, ","");
 if("".equals(largest)){
   System.out.println("There is not consecutive substring for \""+s+"\"");
 }else {
   System.out.println("largest consecutive substring of \""+s+"\" is "+ largest);
 }
以下是我的解决方案:

    String input = "abcdabcdeabcedeabcdefffff";

    String longest = "";
    String temp = "";

    for(int pos=0; pos<input.length(); pos++) {
        if(temp.isEmpty()) {
            temp = String.valueOf(input.charAt(pos));
        } else if(input.charAt(pos) == temp.charAt(temp.length() - 1) + 1) {
            temp += input.charAt(pos);
        } else {
            temp = String.valueOf(input.charAt(pos));
        }

        if(temp.length() > longest.length())
            longest = temp;
    }

    System.out.println(longest);
String input=“abcdabcdeabecdeffff”;
字符串最长=”;
字符串temp=“”;
对于(int pos=0;pos longest.length())
最长=温度;
}
系统输出打印项次(最长);

您也可以使用for
temp
,因为它在Java中构建
String
s时效率更高。

以最少的工作量投票关闭您应该在前面告诉您已经编写了一些代码。。投票重新打开。使用
LinkedHashSet
,这里解释了如何从
aaabcdrrr
中获得
abcd
,abcd是最长的非重复子字符串。是否尝试使用
bcdrrr
。从
b
开始会发生什么?OP ask
我想从字符串中提取最长的不同连续子字符串
不要以
a开头
@ruchiragayanranawera现在它不是连续字符,作为op示例,始终从a开始。哦,经过良好编辑,可以接受任何连续字符的起始类型。@Rod_Algonquin它为以a开头的字符串提供正确答案,但对于以其他字母开头的字符串,它为例如提供了字符串的最后一个字符:对于字符串“nitinj”,我得到了“j”你能建议一些修改吗?@NitinJaiman实际上它不应该给你任何。。因为
nitinj
中没有连续的子字符串。你可以试着用我的答案回答这个问题。nitinj怎么样?它将以
n
的形式给出结果。它只返回
n
nitinj
中只有长度为1的连续序列。在我看来,
i
t
j
也是可以接受的解决方案;-)结果应该是无,因为
nitinj
的子串中没有连续的字符。@RuchiraGayanRanaweera这只是一个定义问题。
largest consecutive substring of "abcdefgdrrstqrstuvwxyzprr" is qrstuvwxyz
    String input = "abcdabcdeabcedeabcdefffff";

    String longest = "";
    String temp = "";

    for(int pos=0; pos<input.length(); pos++) {
        if(temp.isEmpty()) {
            temp = String.valueOf(input.charAt(pos));
        } else if(input.charAt(pos) == temp.charAt(temp.length() - 1) + 1) {
            temp += input.charAt(pos);
        } else {
            temp = String.valueOf(input.charAt(pos));
        }

        if(temp.length() > longest.length())
            longest = temp;
    }

    System.out.println(longest);