dp---两个字符串最长公共子序列

来源:互联网 发布:mac在线重装系统失败 编辑:程序博客网 时间:2024/06/05 05:45

这里写图片描述

package com.lyf.dp;/** * Created by fangjiejie on 2017/10/11. */public class LongestCommonSub {    public static void main(String[] args) {           System.out.println(getSub("1a2c3d4b56","b1d23ca45b6a"));    }    public static int[][] getdp(char []str1,char []str2){        int n1=str1.length;        int n2=str2.length;        int dp[][]=new int[n1][n2];        //dp[i][j]的含义是 遍历到(i,j)位置时,也就是        // 当str1的长度为i.str2的长度为j时,最长公共字串的长度        //dp初始化        dp[0][0]=str1[0]==str2[0]?1:0;        for(int j=1;j<n2;j++){            dp[0][j]=Math.max(dp[0][j-1],str1[0]==str2[j]?1:0);        }        for(int i=1;i<n1;i++){            dp[i][0]=Math.max(dp[i-1][0],str1[i]==str2[0]?1:0);        }        //dp标记状态        for(int i=1;i<n1;i++){            for(int j=1;j<n2;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;    }    public static String getSub(String s1,String s2){        char[] str1=s1.toCharArray();        char[] str2=s2.toCharArray();        int dp[][]=getdp(str1,str2);        int n1=dp.length-1;        int n2=dp[0].length-1;        char result[]=new char[dp[n1][n2]];        System.out.println("最长公共子序列的长度为"+result.length);        int index=result.length;        while (index!=0){            if(n2>0&&dp[n1][n2]==dp[n1][n2-1]){                n2--;            }else if(n1>0&&dp[n1-1][n2]==dp[n1][n2]){                n1--;            }else{                result[--index]=str1[n1];                n1--;                n2--;            }        }        return String.valueOf(result);    }}

这里写图片描述

原创粉丝点击