1. 问题描述:
2. 核心思想
问题结构分析——递推关系建立——自底向上计算——最优方案追踪
3. 算法伪代码
核心算法
输出最长子序列:
3. Java代码实现
// longCommonSubString Algorithm
public class longestCommonSubString {
public static void main(String[] args){
char[] X = {'A', 'B', 'C', 'A', 'D', 'B', 'B'};
char[] Y = {'B', 'C', 'E', 'D', 'B', 'B'};
int[] output = longestCommonSubString(X, Y);
System.out.println("最长公共子串长度:"+output[0]);
printLCS(X, output[0], output[1]);
}
private static int[] longestCommonSubString(char[] X, char[] Y){
int n = X.length;
int m = Y.length;
int[][] C = new int[n+1][m+1];
int lMax = 0;
int pMax = 0;
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] = 0;
}else{
C[i][j] = C[i-1][j-1]+1;
if(C[i][j]>lMax){
lMax = C[i][j];
pMax = i;
}
}
}
}
int[] result = {lMax, pMax};
return result;
}
private static void printLCS(char[] X, int lMax, int pMax){
if(lMax != 0){
for(int i=pMax-lMax+1; i<=pMax; i++){
System.out.print(X[i-1]+ " ");
}
}
}
}