题目
https://leetcode-cn.com/problems/longest-common-subsequence/
分析
1、若 当前两个字符 相等:
当前状态 = 两个元素的前一个状态 + 1
2、若 当前两个字符 不等:
当前状态 = 两个元素任一元素的前一个状态 的 最大值
复杂度
时间复杂度 :O(mn),其中 m 为 text1 的长度,n 为 text2 的长度。
空间复杂度 :O(mn),我们需要大小为O(mn) 的 dp 数组来记录状态值。
代码
一顿操作猛如虎 提交击败百分五
class Solution {
public int longestCommonSubsequence(String text1, String text2) {
int m=text1.length();
int n=text2.length();
int[][] dp=new int[m+1][n+1];
for(int i=1;i<=m;i++){
for(int j=1;j<=n;j++){
if(text1.charAt(i-1)==text2.charAt(j-1))
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=Math.max(dp[i-1][j],dp[i][j-1]);
}
}
return dp[m][n];
}
}
结果
新:如何输出最长公共子序列?
上网本没有编程环境,此处只写思路,代码日后补上。
一、记录方向
增加一个方向数组b[][]。
每次转移时,记录方向。
从左上角 dp[i][j]=dp[i-1][j-1]时,b[i][j]='\\'
从左 dp[i][j]=dp[i][j-1]时,b[i][j]='-'
从上 dp[i][j]=dp[i-1][j]时,b[i][j]='|'
二、输出
递归终止条件:if (i == 0 || j == 0)
b[i][j]='\\' ,打印[i-1][j-1]的序列+当前字符
b[i][j]='-' ,打印[i][j-1]的序列
b[i][j]='|' ,打印[i-1][j]的序列