public class Lcs {
private int b[][];
private int c[][];
private String X;
private String Y;
private int m;
private int n;
// c[i][j] represents the common sequence length of X and Y
public Lcs(String X, String Y) {
this.X = X;
this.Y = Y;
this.m = this.X.length();
this.n = this.Y.length();
this.b = new int[m + 1][n + 1];
this.c = new int[m + 1][n + 1];
System.out.println(lcsLength(X, Y));
printLcs(b, X, m, n);
}
public static void main(String[] args) {
/*String Y = "BDCABA";
String X = "ABCBDAB";*/
String Y = "ABCD";
String X = "ABBCD";
new Lcs(X, Y);
}
public int lcsLength(String X, String Y) {
// Initialize the array c and array d
// set the first column elements to be 0
for (int i = 0; i <= m; i++)
c[i][0] = 0;
// set the first row elements to be 0
for (int j = 0; j <= n; j++)
c[0][j] = 0;
for (int i = 1; i <= m; i++)
for (int j = 1; j <= n; j++) {
//System.out.println("i: "+i+" j: "+j);
if (X.charAt(i - 1) == Y.charAt(j - 1)) {
c[i][j] = c[i - 1][j - 1] + 1;
b[i][j] = 1;
} else if (c[i - 1][j] >= c[i][j - 1]) {
c[i][j] = c[i - 1][j];
b[i][j] = 2;
} else {
c[i][j] = c[i][j - 1];
b[i][j] = 3;
}
}
for (int i = 0; i <= m; i++)
for (int j = 0; j <= n; j++) {
System.out.print(c[i][j] + " ");
if (j == n)
System.out.println();
}
return c[m][n];
}
// i--represents the ith element in X and the index of it should be i-1
public void printLcs(int[][] b, String X, int i, int j) {
if (i == 0 || j == 0)
return ;
if (b[i][j] == 1) {
printLcs(b, X, i - 1, j - 1);
System.out.print(X.charAt(i - 1));
} else if (b[i][j] == 2) {
printLcs(b, X, i - 1, j);
} else if (b[i][j] == 3)
printLcs(b, X, i, j - 1);
}
}
LCS(Loggest Common Sequence)
最新推荐文章于 2021-10-20 22:57:48 发布