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); } }
相关文章推荐
- Python实现求两个字符串的最长公共子序列的算法
- 动态规划求两个字符串的连续最长公共子序列
- 求两个字符串的最长公共子序列的数量
- 小白算法学习:求解两个字符串的最长公共子序列
- 最长公共子串序列一之两个字符串的最长公共子序列
- 算法导论中如何求两个字符串的最长公共子序列
- 求解两个字符串的最长公共子序列
- 求两个字符串的最长公共子序列的长度(动态规划)
- poj1458Common Subsequence(求两个字符串的最长公共子序列)
- 百度2015测试开发面试:两个字符串的最长公共子序列
- POJ 2774 两个字符串的最长公共子序列。
- 计算两个字符串的相似度(递归和DP)
- 求两个字符串的最长公共子序列
- 求两个字符串的最长公共子序列
- 求两个字符串的最长公共子序列 阿里在线笔试题
- 找两个字符串的最长公共子序列的长度
- 求两个字符串的最长公共子序列的长度(动态规划)
- 求两个字符串的最长公共子序列的长度(动态规划)
- POJ 2192 Zipper(判断第3个字符串能否有前两个字符串组成) 水dp
- 求解两个字符串的最长公共子序列