我有一个任务来实现算法,该算法将从两个给定的字符串中找到最长的子字符串:
输入:
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],这是不期望的。有什么方法可以修改条件,以便仅将最长的字符串添加到列表中?或删除所有先前的较短字符串?
预先感谢
答案 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;
}