// 算法导论 15.4 最长公共子序列问题 15.4-2
public class LongestCommonSubsequence {
public static int lcsLength(char[] arrX, char[] arrY) { // O(m*n)
System.out.println(Arrays.toString(arrX));
System.out.println(Arrays.toString(arrY));
int m = arrX.length;
int n = arrY.length;
int[][] resultC = new int[m + 1][n + 1];
char[][] auxB = new char[m][n];
for (int i = 0; i <= m; i++) {
resultC[i][0] = 0;
}
for (int j = 0; j <= n; j++) {
resultC[0][j] = 0;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
int indX = i - 1;
int indY = j - 1;
if (arrX[indX] == arrY[indY]) {
resultC[i][j] = resultC[i - 1][j - 1] + 1;
auxB[indX][indY] = '\\';
}
else {
int upRowLen = resultC[i - 1][j];
int leftColLen = resultC[i][j - 1];
if (upRowLen >= leftColLen) {
resultC[i][j] = upRowLen;
auxB[indX][indY] = '|';
}
else {
resultC[i][j] = leftColLen;
auxB[indX][indY] = '-';
}
}
}
}
for (int i = 0; i <= m; i++) {
System.out.println(Arrays.toString(resultC[i]));
}
for (int i = 0; i < m; i++) {
System.out.println(Arrays.toString(auxB[i]));
}
printLcs(resultC, arrX, arrY, m, n);
System.out.println();
return resultC[m][n];
}
public static void printLcs(char[][] auxB, char[] arrX, int i, int j) {
if (i == 0 || j == 0) {
return;
}
if (auxB[i - 1][j - 1] == '\\') {
printLcs(auxB, arrX, i - 1, j - 1);
System.out.print(arrX[i - 1] + ",");
}
else {
if (auxB[i - 1][j - 1] == '|') {
printLcs(auxB, arrX, i - 1, j);
}
else {
printLcs(auxB, arrX, i, j - 1);
}
}
}
public static void printLcs(int[][] result, char[] arrX, char[] arrY, int i, int j) {
if (i == 0 || j == 0) {
return;
}
if (arrX[i-1]== arrY[j-1] && (result[i][j] == result[i-1][j-1]+1)) {
printLcs(result, arrX, arrY, i - 1, j - 1);
System.out.print(arrX[i - 1] + ",");
}
else if (result[i][j] == result[i - 1][j]) {
printLcs(result, arrX, arrY, i - 1, j);
}
else if (result[i][j] == result[i][j - 1]) {
printLcs(result, arrX, arrY, i, j - 1);
}
}
public static void main(String[] args) {
char[] arrayX = { 'A', 'B', 'C', 'B', 'D', 'A', 'B' };
char[] arrayY = { 'B', 'D', 'C', 'A', 'B', 'A' };
char[] arrayY1 = { 'B', 'D', 'C', 'A', 'B', 'A', 'B' };
int lcsLen;
lcsLen = lcsLength(arrayX, arrayY);
System.out.println("Longest common subsequence:" + lcsLen);
lcsLen = lcsLength(arrayX, arrayY1);
System.out.println("Longest common subsequence:" + lcsLen);
lcsLen = lcsLength(arrayY, arrayY1);
System.out.println("Longest common subsequence:" + lcsLen);
}
}
最长公共子序列问题 算法导论15.4
最新推荐文章于 2019-11-26 13:45:06 发布