码迷,mamicode.com
首页 > 其他好文 > 详细

[程序员代码面试指南]递归和动态规划-最长公共子串问题

时间:2019-05-09 23:50:46      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:solution   子串   max   private   ++i   array   lse   描述   substr   

题目描述

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

解题思路

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

[程序员代码面试指南]递归和动态规划-最长公共子串问题

标签:solution   子串   max   private   ++i   array   lse   描述   substr   

原文地址:https://www.cnblogs.com/coding-gaga/p/10841661.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!