[程序员代码面试指南]递归和动态规划-最长公共子串问题
Posted coding-gaga
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[程序员代码面试指南]递归和动态规划-最长公共子串问题相关的知识,希望对你有一定的参考价值。
题目描述
给定两个串,输出最长公共子串。
解题思路
维护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);
}
}
以上是关于[程序员代码面试指南]递归和动态规划-最长公共子串问题的主要内容,如果未能解决你的问题,请参考以下文章