zoukankan      html  css  js  c++  java
  • [程序员代码面试指南]递归和动态规划-最长公共子序列问题(DP,LCS)

    题目描述

    给定两个串,输出最长公共子序列。

    解题思路

    维护dp[i][j],表示子串str1[0:i+1]与str2[0:j+1]的最长公共子序列长度。
    由dp[][]右下角开始,找公共子序列。

    代码

    public class Solution{	
    	private int[][] getDp(char[] str1,char[] str2){
    		int[][] dp=new int[str1.length][str2.length];
    		int temp=0;
    		for(int i=0;i<str1.length;++i) {
    			if(str1[i]==str2[0]) {
    				temp=1;
    			}
    			dp[i][0]=temp;
    		}
    		temp=0;
    		for(int j=0;j<str2.length;++j) {
    			if(str2[j]==str1[0]) {
    				temp=1;
    			}
    			dp[0][j]=temp;
    		}
    		for(int i=1;i<str1.length;++i) {
    			for(int j=1;j<str2.length;++j) {
    				dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j]);
    				if(str1[i]==str2[j]) {
    					dp[i][j]=Math.max(dp[i-1][j-1]+1,dp[i][j]);
    				}
    			}
    		}
    		return dp;
    	}
    	
    	public String lcs(String str1,String str2) {
    		int[][] dp=getDp(str1.toCharArray(),str2.toCharArray());
    		int m=dp.length-1;
    		int n=dp[0].length-1;
    		int subStrLen=dp[m][n];
    		char[] subStr=new char[subStrLen];
    		int index=subStrLen-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 {
    				subStr[index--]=str1.charAt(m);
    				--m;
    				--n;
    			}
    		}
    		return String.valueOf(subStr);
    	}
    }	
    
  • 相关阅读:
    Java
    HashMap数据结构与实现原理解析(干货)
    Java
    Java
    Java
    面向对象基础
    Java
    Java
    Java
    shell脚本
  • 原文地址:https://www.cnblogs.com/coding-gaga/p/10841661.html
Copyright © 2011-2022 走看看