LeetCode 题解:1143. 最长公共子序列,动态规划,JavaScript,详细注释

原题链接:https://leetcode-cn.com/problems/longest-common-subsequence/
解题思路:
我们来看这样一个 Case:text1 = "xabccde", text2 = "ace",将两个字符串分别作为表格行列排列如下图:
图片来自:[C++ with picture, O(nm)](https://leetcode.com/problems/longest-common-subsequence/discuss/348884/C%2B%2B-with-picture-O(nm))。
假设
text1长度为m,索引为i。text2长度为n,索引为j。公共子序列要判断每个字母是否相等,
dp[i][j]的状态必须由dp[i - 1][j - 1]推导而来,因此我们可以创建一个(m + 1) * (n + 1)的矩阵。将索引0的位置,即空字符串作为初始状态开始递推,此时公共子序列都为0。对于
text1[i - 1]和text2[j - 1],可以分为两种情况分析:
* 当i = 7; j = 3;时,text1[i - 1]和text2[j - 1]相等,都为e。当前状态dp[i][j]由dp[i - 1][j - 1],也就是子串xabccd和ac的结果加 1 而来,因此递推公式为:dp[i][j] = dp[i - 1][j - 1] + 1;。
* 当i = 6; j = 2;时,text1[i - 1] = 'd',text2[j - 1] = 'c',两者不相等。但此时他们的两对子串分别为:
* xabccd与a,子序列数量为 1。
* xabcc与ac,子序列数量为 2。
因此xabccd与ac的子序列即为两者中较大值 2,状态转移方程为:dp[i][j] = Math.max(dp[i - 1][j], dp[i][j - 1]);
版权声明: 本文为 InfoQ 作者【Lee Chen】的原创文章。
原文链接:【http://xie.infoq.cn/article/306f57eb1cd5a601b0115f36d】。文章转载请联系作者。











评论