最长公共子序列

来源:互联网 发布:东莞房地产成交数据 编辑:程序博客网 时间:2024/06/07 02:52

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


原创粉丝点击