【算法】动态规划—最长公共子序列

        最长公共子序列问题就是求出两个字符串的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的行和列表示空串,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值