您的位置:首页 > 其它

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

2017-10-11 14:51 211 查看


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);
}
}


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: