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】。文章转载请联系作者。
评论