LeetCode 例题精讲 | 15 最长公共子序列:二维动态规划的解法

本文通过LeetCode 15题,详细讲解了二维动态规划解法,包括定义子问题、递推关系、计算顺序和空间优化,帮助读者掌握二维动态规划的基本解题步骤。
摘要由CSDN通过智能技术生成

本期例题:LeetCode 1143. Longest Common Subsequence 最长公共子序列(Medium)

给定两个字符串 st,返回这两个字符串的最长公共子序列的长度。若这两个字符串没有公共子序列,则返回 0。

一个字符串的子序列是指这样一个新的字符串:它是由原字符串在不改变字符的相对顺序的情况下删除某些字符(也可以不删除任何字符)后组成的新字符串。例如,"ace" 是 "abcde" 的子序列。

在上一篇文章中,我们以打家劫舍(House Robber)问题为例讲解了动态规划问题的一般解题步骤。不过,打家劫舍问题是一维动态规划问题,而还有很多题目属于二维动态规划。今天我们就以一道经典的「最长公共子序列」问题讲解二维动态规划的解法。

最长公共子序列问题经典到什么程度呢?经典到有自己的专用缩写 —— LCS (Longest Common Subsequence)。如果你在别的地方看到 LCS 的缩写,要能够知道这是最长公共子序列的问题。

如果说打家劫舍问题是动态规划的最佳入门题,那么 LCS 问题就是二维动态规划的最佳入门题,问题经典,方法典型。本文会在一步步求解 LCS 问题的过程中,讲解二维动态规划问题的解题要领。

本文假设你已经了解了打家劫舍问题的解法以及动态规划问题的基本解题步骤。对此不是很清楚的同学可以回顾一下上一篇文章:

LeetCode 例题精讲 | 14 打家劫舍问题:动态规划的解题四步骤

一维与二维动态规划

首先我们要清楚一维动态规划与二维动态规划的含义。对于打家劫舍问题,我们定义 为偷前 间房子的最大金额。这里子问题只有一个参数 ,因此是一维动态规划问题,参数只会在一个维度上变化。而如果子问题有两个参数,则为二维动态规划问题,参数会在两个维度上变化。

为什么要区分子问题的维度呢?这是因为子问题的维度会直接影响 DP 数组的维度。二维的 DP 数组不仅空间复杂度变大,DP 数组的计算顺序也更复杂。

一般来说,绝大多数动态规划问题的维度不会超过二维。必须使用三维以上子问题的题目属于难题,不需要掌握。

使用四步骤解题

上一篇文章中,我们讲解了动态规划题目的的四个基本解题步骤:

  • 定义子问题

  • 写出子问题的递推关系

  • 确定 DP 数组的计算顺序

  • 空间优化(可选)

二维动态规划问题同样遵循这四个解题步骤,不过每个步骤可能会更复杂。下面我们使用四步骤方法一步步解决 LCS 问题。

步骤一:定义子问题

要定义子问题,我们还是抓住这样一个子问题的基本性质:子问题是和原问题相似,但规模较小的问题

对于 LCS 问题,原问题是「st 的最长公共子序列」。那么子问题可以缩小字符串 s 或者 t 的规模,变成「s 的前 个字符(s[0..i))和 t 的前 个字符(t[0..j))的最长公共子序列」,用 表示。

可以看到,子问题有 两个参数,属于二维 DP 问题。

LCS 问题的子问题定义

步骤二:写出子问题的递推关系

这一步是求解动态规划问题最关键的一步。二维的子问题有很多可能的递推关系,有些题目一目了然,有些则可能需要仔细推敲。

一般来说,我们首先思考能不能使用一种最简单的子问题递推关系:看当前子问题和前一个子问题的关系。如果是一维子问题,就是看

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值