1. 问题描述:
2. 核心思想
问题结构分析——递推关系建立——自底向上计算——最优方案追踪
3. 算法伪代码
核心算法
输出最长子序列:
3. Java代码实现
// longestCommonSubsequence Algorithm
public class longestCommonSubsequence {
private static String[][] rec;
public static void main(String[] args){
char[] X = {'A', 'B', 'C', 'B', 'D', 'A', 'B'};
char[] Y = {'B', 'D', 'C', 'A', 'B', 'A'};
int n = X.length;
int m = Y.length;
rec = new String[n+1][m+1];
int maxLength = longestCommonSubsequence(X, Y, n, m);
System.out.println("最长子数组长度:\n"+maxLength+"\n最长子数组为:");
printLCS(X, n, m);
}
private static int longestCommonSubsequence(char[] X, char[] Y, int n, int m){
int[][] C = new int[n+1][m+1];
for (int i=0; i<=n; i++){
C[i][0] = 0;
}
for(int j=0; j<=m; j++){
C[0][j] = 0;
}
for(int i=1; i<=n; i++){
for (int j=1; j<=m; j++){
if(X[i-1] == Y[j-1]){
C[i][j] = C[i-1][j-1]+1;
rec[i][j] = "LU";
}else if (C[i-1][j]>=C[i][j-1]){
C[i][j] = C[i-1][j];
rec[i][j] = "U";
}else{
C[i][j] = C[i][j-1];
rec[i][j] = "L";
}
}
}
return C[n][m];
}
private static void printLCS(char[] X, int i, int j){
if(i==0 || j==0){
return ;
}
if(rec[i][j].equals("LU")){
printLCS(X, i-1, j-1);
System.out.println(" "+ X[i-1]);
}else if (rec[i][j].equals("U")){
printLCS(X, i-1, j);
}else{
printLCS(X, i, j-1);
}
}
}