//最长公共子序列
public class MaxLenSequence{
//获得最长公共子序列长度(动态规划矩阵)
public static int[][]getdp(char[]str1,char[]str2)
{
int[][]dp=new int[str1.length][str2.length];
dp[0][0]=str1[0]==str2[0]?1:0;
//第一列的计算
for(int i=1;i<str1.length;i++)
{
dp[i][0]=Math.max(dp[i-1][0],str1[i]==str2[0]?1:0);
}
//第一行的计算
for(int j=1;j<str2.length;j++)
{
dp[0][j]=Math.max(dp[0][j-1],str1[0]==str2[j]?1:0);
}
//其他位置的计算
for(int i=1;i<str1.length;i++)
{
for(int j=1;j<str2.length;j++)
{
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
if(str1[i]==str2[j])
{
dp[i][j]=Math.max(dp[i][j],dp[i-1][j-1]+1);
}
}
}
return dp;
}
//获得最长公共子序列(通过dp还原最长公共子序列)
public static String MaxlenSequence(String str1,String str2)
{
if(str1==null||str2==null||str1.equals("")||str2.equals(""))
{
return "";
}
//将字符串转换为数组
char[]chs1=str1.toCharArray();
char[]chs2=str2.toCharArray();
int[][]dp=getdp(chs1,chs2);
int m=chs1.length-1;
int n=chs2.length-1;
char[]res=new char[dp[m][n]];
int index=res.length-1;
while(index>=0)
{
if(n>0&&dp[m][n]==dp[m][n-1])
{
n--;
}
else if(m>0&&dp[m][n]==dp[m-1][n])
{
m--;
}
else{
res[index--]=chs1[m];
m--;
n--;
}
}
return String.valueOf(res);
}
public static void main(String[]args)
{
String str1="1A2C43D4B56";
String str2="B1D23CA45B6A";
System.out.println(MaxlenSequence(str1,str2));
}
}
最长公共子序列
最新推荐文章于 2025-05-24 12:00:00 发布