首先分清出最长公共子串与最长公共子序列的区别:
找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。而最长公共子序列则并不要求连续。
比如说:两个字符串“asdfghjkl”和“adghjkl”。最长公共子串指的是:“ghjk”,而最长共子序列指的是:“adghjkl”。
由于寻找公共子序列比较简单,在这里就直接上代码了。
参考代码:
public class LCS {
public static void main(String[] args) {
String str1 = "asdfghjkl";
String str2 = "adghjkl";
String comStr = getLcs(str1,str2);
System.out.println("最大子串为:" + comStr + " ,长度为:" + comStr.length());
}
private static String getLcs(String str1, String str2) {
int len1 = str1.length();
int len2 = str2.length();
int minlen = len1 < len2 ? len1 : len2;
int max = 0, index = 0;
String minstr = len1 < len2 ? str1 : str2;
String maxstr = len1 < len2 ? str2 : str1;
for(int i = 0; i < minlen; i++){
for(int j = i + 1;j < minlen + 1; j++){
String temp = minstr.substring(i, j);
if(maxstr.contains(temp) && temp.length() > max){
max = temp.length();
index = i;
}
}
}
return minstr.substring(index, max + index);
}
}
代码比较简单,在这里并不作太多的解释。