import java.util.ArrayList;
import java.util.List;
/**
* 最长公共子串。下面是矩阵方法求的,也就是对角线最长的即为最长公共子串
* @author xiong
*
*/
public class LCS {
private static List getLCS(String str1, String str2) {
if (str1 == null || str2 == null) {
return null;
}
if (str1.isEmpty() || str2.isEmpty()) {
return null;
}
return getLCS(str1.toCharArray(), str2.toCharArray());
}
private static List getLCS(char[] str1, char[] str2) {
// 检测参数略
List list = new ArrayList();
int len1 = str1.length, len2 = str2.length;
int LEN = len1 > len2 ? len1 : len2;
int[] maxLen = new int[LEN];
int[] maxLenIndex = new int[LEN];
int[] c = new int[LEN];
for (int y = 0; y < LEN; y++) {
for (int x = LEN - 1; x >= 0; x--) {
if (str2[y] == str1[x]) {
if (y == 0 || x == 0) {
c[x] = 1;
} else {
c[x] = c[x - 1] + 1;
}
} else {
c[x] = 0;
}
if (c[x] > maxLen[0]) {
maxLen[0] = c[x];
maxLenIndex[0] = x;
for (int k = 1; k < LEN; k++) {
maxLen[k] = 0;
maxLenIndex[k] = 0;
}
} else if (c[x] == maxLen[0]) {
for (int k = 1; k < LEN; k++) {
if (maxLen[k] == 0) {
maxLen[k] = c[x];
maxLenIndex[k] = x;
break;
}
}
}
}
}
//组合字符串
for(int k=0;k<LEN;k++){
if(maxLen[k]>0){
StringBuffer sb=new StringBuffer();
for(int i=maxLenIndex[k]-maxLen[k]+1;i<=maxLenIndex[k];i++){
sb.append(str1[i]);
}
list.add(sb.toString());
}
}
return list;
}
/**
* @param args
*/
public static void main(String[] args) {
String str1 = new String("abc1ff3");
String str2 = new String("abc2ff3");
List list = getLCS(str1.toCharArray(), str2.toCharArray());
for (int i = 0; i < list.size(); i++) {
System.out.println(list.get(i));
}
}
}