Java-查找最长子字符串-LinkedList问题

时间:2018-06-27 17:03:22

标签: java string list substring

我有一个任务来实现算法,该算法将从两个给定的字符串中找到最长的子字符串:

输入:

String s1="AAABBA";
String s2="ABAABBAAA";

因此它将是AABBA。所以我实现了一个返回String的方法,但是后来得到了我-如果有两个相等且最大可能长度的子字符串呢?那是我决定改用LinkedList的时候。

例如:

String s1="ABCIJK";
String s2="ABCDEFGHIJK";

所以我期望这里实际上是两个子字符串,分别是ABC和IJK。

我有代码:

import java.util.LinkedList;

public class SubstringFinder {

    public static LinkedList<String> findTheLongestSubstring(String s1, String s2)
    {
        LinkedList<String> allFound = new LinkedList<String>();
        String theLongest="";
        if(s1.length()>s2.length())
        {
            s1 = s1 + s2;
            s2 = s1.substring(0, (s1.length() - s2.length()));
            s1 = s1.substring(s2.length());
        }
                for(int j=0;j<s1.length();j++)
                {
                    for(int i=s1.length()-j; i>=0;i--)
                    {
                        if(s1.substring(j,j+i).length()>=theLongest.length() && s2.contains(s1.substring(j,j+i)))
                        {   
                            allFound.remove(theLongest);
                            theLongest=s1.substring(j,j+i);
                            allFound.add(theLongest);
                        }
                    }
                }

        return allFound;
    }

    public static void main(String[] args) {

        //String s1="ABCIJK";
        //String s2="ABCDEFGHIJK";
        String s1="AAABBA";
        String s2="ABAABBAAA";
        System.out.println(findTheLongestSubstring(s1,s2));

    } 
}   

它只向我返回“ IJK”,而不是[ABC,IJK]。当我发表评论

allFound.remove(theLongest)

在[ABC,IJK]的情况下可以正常工作,但随后也会在[AABBA]结果中添加[AAA],这是不期望的。有什么方法可以修改条件,以便仅将最长的字符串添加到列表中?或删除所有先前的较短字符串?

预先感谢

1 个答案:

答案 0 :(得分:3)

我已经相应地修改了方法,请检查我的在线注释

public static LinkedList<String> findTheLongestSubstring(String s1, String s2)
    {
        LinkedList<String> allFound = new LinkedList<String>();
        String theLongest="";
        if(s1.length()>s2.length())
        {
            s1 = s1 + s2;
            s2 = s1.substring(0, (s1.length() - s2.length()));
            s1 = s1.substring(s2.length());
        }
        for(int j=0;j<s1.length();j++)
        {
            for(int i=s1.length()-j; i>=0;i--)
            {
                if(s1.substring(j,j+i).length()>=theLongest.length() && s2.contains(s1.substring(j,j+i)))
                {
                    theLongest = s1.substring(j, j+i);
                    // before adding any string check the length of existing string if it is less then remove it
                    if (allFound.size() > 0 && allFound.getFirst().length() < theLongest.length()) {
                        allFound.removeFirst();
                    }
                    allFound.add(theLongest);
                }
            }
        }

        return allFound;
    }
相关问题