package 最长公共子序列;
import java.util.Scanner;
public class Max_Lcs {
public void lcslength(char x[],char y[],int c[][],int b[][]){
int m=x.length-1;
int n=y.length-1;
for(int i=0;i<=m;i++)
{
c[i][0]=0;
b[i][0]=0;
}
for(int j=0;j<=n;j++){
c[0][j]=0;
b[0][j]=0;
}
for(int i=1;i<=m;i++)
for(int j=1;j<=n;j++){
if (x[i]==y[j]){
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;
}
}
}
public void lcs(int i,int j,char x[],int b[][]){
if(i==0||j==0)return;
if(b[i][j]==1){
lcs(i-1,j-1,x,b);
System.out.print(x[i]);
}else if(b[i][j]==2)lcs(i-1,j,x,b);
else lcs(i,j-1,x,b);
}
public void Array_Print(int s[][],int m,int n){
for(int i=0;i<=n;i++){
for(int j=0;j<=n;j++)
System.out.printf("%5d",s[i][j]);
System.out.println();
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc=new Scanner(System.in);
System.out.print("输入序列X:");
String s1=sc.nextLine();
char x[]=s1.toCharArray();
System.out.print("输入序列Y:");
String s2=sc.nextLine();
char y[]=s2.toCharArray();
int m=x.length-1,n=y.length-1;
int c[][]=new int [m+1][n+1];
int b[][]=new int [m+1][n+1];
Max_Lcs t=new Max_Lcs();
t.lcslength(x, y, c, b);
System.out.println("各个子问题的最长公共子序列长度:");
t.Array_Print(c,m,n);
System.out.println("各子问题的最长公共子序列的类型:");
t.Array_Print(b, m, n);
System.out.println("序列x和序列y的最长公共子序列长度:"+c[m][n]);
System.out.println("序列x和序列y的最长公共子序列:");
t.lcs(m, n, x, b);
sc.close();
}
}
最终结果: