最长公共子序列问题就是求出两个字符串的LCS长度,是一道非常经典的面试题目,因为它的解法是典型的二维动态规划。
比如输入 str1 = "babcde", str2 = "acbe",算法应该输出3,因为 str1 和 str2 的最长公共子序列是 "ace",它的长度是3。
子序列类型的问题,穷举出所有可能的结果都不容易,而动态规划算法做的就是穷尽+剪枝,它俩天生一对。所以可以说只要涉及子序列问题,十有八九需要动态规划来解决,往这方面考虑就对了。
动态规划思路
第一步,一定要明确dp数组的含义
对于两个字符串的动态规划问题,套路都是通用的,一般都需要一个二维dp数组。比如对于字符串 str1 和 str2,一般来说要构造一个这样的 DP table:
其中,dp[i][j]的含义是:对于 str1[0...i-1] 和 str2[0...j-1],它们的LCS长度是 dp[i][j]。
上图这个例子,dp[2][4] = 2 的含义就是:对于 "ac" 和 "babc",它们的LCS长度是2。根据这个定义,最终想得到的答案应该是 dp[3][6]。
第二步,定义base case
专门让索引为0的行和列表示空串,