最长公共子序列

//最长公共子序列
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));
  

	}
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值