动态规划-两个数组的dp问题——1143.最长公共子序列
1.题目解析
题目来源:1143.最长公共子序列——力扣
测试用例
2.算法原理
1.状态表示
由题目可知是两个dp表的动态规划问题,那么一维dp表显然无法满足状态表示,所以需要一个二维dp表,这里的dp[i][j]表示:s1字符数组[0,i]区间与s2字符数组[0,j]区间的最长公共子序列的长度
2.状态转移方程
状态转移方程需要判断最后一个位置的字符是否相等来分类讨论,如下
3.初始化
初始化需要用到空串并且需要注意对于下标映射的处理,如图
4.填表顺序
在填写dp[i][j]时可能用到dp[i-1][j]与dp[i][j-1]以及dp[i-1][j-1]位置的值,那么就需要从上到下,每一行从左到右来填表
5.返回值
根据状态表示直接返回dp[m][n]即可
3.实战代码
代码解析
class Solution {
public:int longestCommonSubsequence(string text1, string text2) {int m = text1.size();int n = text2.size();vector<vector<int>> dp(m + 1, vector<int>(n + 1));text1 = " " + text1;text2 = " " + text2;for (int i = 1; i <= m; i++) {for (int j = 1; j <= n; j++) {if (text1[i] == text2[j]) {dp[i][j] = dp[i - 1][j - 1] + 1;} else {dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);}}}return dp[m][n];}
};