没有(6)(7)。因为我 14 号爆肝复习,15 号考试,晚上两个 DDL。

LC 72. 编辑距离

已经单独文章给出。

LC 115. 不同的子序列

求给定 S 和 T 串,求 S 的所有子序列中,等于 T 的子序列的个数。

s = babgbag
t = bag

字符串匹配的通用思路:

设关系 $R (s,t)$ 表示 S 的所有子序列中,等于 T 的子序列的个数

设递推关系 $f (i,j)$ 为 $R (s [0:i],t [0:i])$

如果 $s [i]$ 能够参与匹配,比如上面例子中结尾的 g 参与匹配,则:

  • 需要满足 $s [i] = t [i]$,即结尾字符相等。否则一定无法匹配。

  • 匹配剩余部分:$s [0:i-1]$ 匹配 $t [0:j-1]$

无论 $s [i]$ 能否参与匹配,都可以:

  • $s [0:i-1]$ 匹配 $t [0:j]$

综上,则

$$ f(i,j) = \left\{\begin{align} f(i-1,j) + f(i-1,j-1) &;s[i] = t[i]\\ f(i-1,j) &;\text{else} \end{align}\right. $$

即:

dp[i][j] = dp[i-1][j];
if (s[i-1]==t[j-1]) dp[i][j]+=dp[i-1][j-1];

LC 514. 自由之路

电子游戏 “辐射 4” 中,任务 “通向自由” 要求玩家到达名为 “Freedom Trail Ring” 的金属表盘,并使用表盘拼写特定关键词才能开门。

给定一个字符串 ring,表示刻在外环上的编码;给定另一个字符串 key,表示需要拼写的关键词。您需要算出能够拼写关键词中所有字符的最少步数。

最初,ring 的第一个字符与 12:00 方向对齐。您需要顺时针或逆时针旋转 ring 以使 key 的一个字符在 12:00 方向对齐,然后按下中心按钮,以此逐个拼写完 key 中的所有字符。

旋转 ring 拼出 key 字符 key [i] 的阶段中:

  1. 您可以将 ring 顺时针或逆时针旋转一个位置,计为 1 步。旋转的最终目的是将字符串 ring 的一个字符与 12:00 方向对齐,并且这个字符必须等于字符 key [i] 。
  2. 如果字符 key [i] 已经对齐到 12:00 方向,您需要按下中心按钮进行拼写,这也将算作 1 步。按完之后,您可以开始拼写 key 的下一个字符(下一阶段), 直至完成所有拼写。

示例:

img

输入: ring = "godding", key = "gd"
输出: 4
解释:
对于 key 的第一个字符 'g',已经在正确的位置,我们只需要 1 步来拼写这个字符。
 对于 key 的第二个字符 'd',我们需要逆时针旋转 ring "godding" 2 步使它变成 "ddinggo"。
当然,我们还需要 1 步进行拼写。
 因此最终的输出是 4。
  • 按下中间算一步
  • 左右转一次算一步

这题是有那么一点反套路的。我们注意到这个环不能动,它是首尾缝合的。而 key 每解决一个,就少掉一位。而决定状态的,是 ring 指针位置 j 和 key 指针位置 i。

所以定义 $f (i,j)$ 表示 ring 的状态为 j,要达成 k [0:i] 所需要的最小步数。

矩阵坐标型

棋盘最小代价路径(Min Cost Path in Chess Board)

给定 nxm 棋盘,每格上的值代表通过代价。求一条从第一行到最后一行的路径,使得代价最小。

每一步允许的走法:

/ | \

即左下、正下、右下

解:

可以发现,要到达格子 $f (i,j)$,只能从 $f (i-1,j-1) ,f (i-1,j), f (i-1,j+1)$ 三个方向过来。所以定义:

$f(i,j) = \min\{f(i-1,j-1) ,f(i-1,j), f(i-1,j+1)\} + \text{cost}(i,j)$

假设代价表如下:

image-20211117000513758

逐行求解,最后一行最小值就是解。

image-20211117000851295

最长增长路径(Longest Increasing Path)

给定 nxm 矩阵,寻找最长增长路径。

(1)如果允许走下或者右。

image-20211117001426277

解:很简单,设 $f (i,j)$ 表示从 (i,j) 开始的最长增长路径。我们从最后一行最后一列开始计算即可。

(2)如果允许走上下左右四个方向

解:Top down

最大对角矩阵的大小

即给一个二值 nxn 矩阵,求其子矩阵中最大对角矩阵(主对角线之外的元素皆为 0)大小。要求时间复杂度不超过 $O (n^2)$