思路:
仿照最长公共子序列(Longest Common Subsequence),将比较X和Y,字符相同时,处理方法不变, c[i][j] = c[i-1][j-1] + 1,b[i][j] 设为特定字符(如"\");不同时,将c[i][j]置任意一个字符或不处理,将b[i][j]置0;比较完成后,在矩阵b中寻找最大的值,并找出下标,代入到打印函数进行打印;打印时进行递归,若为之前设定的特殊字符,则打印X或Y相应位置的字符;否则完成打印。
public class LCSubstring{
public static void LCSLength(final int[][] c,final String[][] b, String[] X,String[] Y){
int m = X.length;
int n = Y.length;
for(int i = 1; i <= m;i++){
c[i][0] = 0;
}
for(int i = 1; i <= n; i++){
c[0][i] = 0;
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(X[i-1].equals(Y[j-1])){
c[i][j] = c[i-1][j-1]+1;
b[i][j] = "\\";
}
else {
c[i][j] = 0;
//b[i][j] = ".";
}
}
}
}
public static void MaxValue(String[][] b,String[] X,int[][] c,int m,int n){
int x = 0;
int y = 0;
int max = c[0][0];
for(int i = 1; i < m;i++){
for(int j = 1; j < n;j++){
if(c[i][j]>=max){
max = c[i][j];
x = i;
y = j;
}
}
}
System.out.println(max);
PrintLCS(b, X, x, y);
}
public static boolean PrintLCS(String[][] b,String[] X,int i,int j){
if(i==0||j==0){
return false;
}
if(b[i][j].equals("\\")){
PrintLCS(b, X, i-1, j-1);
System.out.print(X[i-1]+" ");
}
return true;
}
public static void main(String[] args){
String str1 = "MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCALLAAQANKESSSESFISRLLAIVAD";
String str2 = "MAEEEVAKLEKHLMLLRQEYVKLQKKLAETEKRCTLLAAQANKENSNESFISRLLAIVAG";
String[] X = str1.split("");
String[] Y = str2.split("");
int m = X.length+1;
int n = Y.length+1;
int[][] c = new int[m][n];
String[][] b = new String[m][n];
LCSLength(c, b, X, Y);
/*
for(int i = 0; i < m; i++){
for(int j = 0 ; j < n; j++){
System.out.print(c[i][j]+"\t");
}
System.out.println();
}
*/
MaxValue(b, X,c,m,n);
}
}
写的不好,请多指教。