获取两个字符串中相同的最大子字符串

时间:2012-10-19 01:23:45

标签: java

我试图找到两个字符串中最大的子串(最小长度为3)。如果我有:

String test1 = "testthatthisworks";
String test2 = "testthisthat";

我需要的答案是:

String[] Answer = ["test", "that", "this"];

我的一个问题是这需要尽可能快。我当前的解决方案是使用长度为3的子串从最小的字符串开始,然后查看是否存在于较大的字符串中,如果它确实增加了子字符串的大小,如果不是沿1点移动子字符串。问题是随着字符串长度的增加,这非常慢。有没有人有解决这个问题的方法?

谢谢

3 个答案:

答案 0 :(得分:2)

答案 1 :(得分:1)

搜索最长公共子序列(LCS)问题和算法。您将从实现找到两个字符串的LCS的算法中获得很多提示。以下是一个示例:http://introcs.cs.princeton.edu/java/96optimization/LCS.java.html

如果仔细跟踪LCS算法,它会检索所有常见的子字符串,直到找到最长的子字符串。因此,您可以通过检查它们的长度来添加一些代码来收集这些子串,即长度> 3。

答案 2 :(得分:1)

这是对LCS algorithm的修改,它将返回所有最大长度匹配 最大尺寸:

public static Collection<String> longestCommonSubstrings(String S1, String S2){
  return longestCommonSubstrings(S1, S2, 0);
}

public static Collection<String> longestCommonSubstrings(String S1, String S2, int minimumLength){

Collection<Integer> indexes = new ArrayList<Integer>();
int Max = minimumLength;

for (int i = 0; i < S1.length(); i++){
  for (int j = 0; j < S2.length(); j++){
    int x = 0;
    int y = Math.min(S1.length()-i,S2.length()-j);
    while (x < y && (S1.charAt(i + x) == S2.charAt(j + x) )){
      x++;
    }
    if (x > Max){
      Max = x;
      indexes = new ArrayList<Integer>();
      indexes.add(i);
    }else if (x == Max){
      indexes.add(i);
    }
  }
}
Collection<String> results = new HashSet<String>();
for (Integer i : indexes){
  results.add(S1.substring(i, (i + Max)));
}
return results;
}