package someLearn;
//最长公共子序列 就当是收藏一下代码 也没什么好讲的 主要就是关于数组大小的问题应该定义为c[m+1][n+1] z这样就可以用c[m][n] 来表示长度为m n的最长公共子序列
public class Lcs {
public static int lcs(String str1,String str2){
int m=str1.length();
int n=str2.length();
int [][] c=new int[m+1][n+1];//记录c[i][j] 即Xi,Yj最长公共子序列长度
int [][] b=new int[m+1][n+1];
for(int i=0;i<=m;i++){
for(int j=0;j<=n;j++){
if(i==0||j==0){
c[i][j]=0;
}else if(str1.charAt(i-1)==str2.charAt(j-1)){
c[i][j]=c[i-1][j-1]+1;
b[i][j]=0;
}else if(c[i-1][j]>=c[i][j-1]){
c[i][j]=c[i-1][j];
b[i][j]=1;
}else{
c[i][j]=c[i][j-1];
b[i][j]=2;
}
}
}
printLcs(b, str1, m, n);
return c[m][n];
}
public static void printLcs(int[][]b,String str1,int m,int n){
if(m==0||n==0){
return ;
}
if(b[m][n]==0){
printLcs(b, str1, m-1, n-1);
System.out.print(str1.charAt(m-1));
}else if(b[m][n]==1){
printLcs(b, str1, m-1, n);
}else{
printLcs(b, str1, m, n-1);
}
}
public static void main(String[] args) {
String str1="ABDCABDCA";
String str2="ADSBADBASDQ";
System.out.println(lcs(str1, str2));
}
}
最长公共子序列 java 代码实现
最新推荐文章于 2022-10-17 19:43:39 发布