【DP】编辑距离
https://leetcode.cn/problems/edit-distance/description/?envType=study-plan-v2&envId=top-interview-150
非常难的一种考虑方式,感觉体现了对动态规划的深层理解,就是一定要一步一步来,要研究哪个是子问题。不能看到一大坨东西直接开搞。
【转载】dp[i][j] 代表将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最少步数。
因此,根据题目给出的状态转移方程:
当 word1[i] == word2[j] 时,不需要进行操作,dp[i][j] = dp[i-1][j-1];
当 word1[i] != word2[j] 时,需要进行替换、删除或插入操作,选择其中步数最小的操作数进行转换,即:
dp[i][j] = min(dp[i-1][j-1], dp[i-1][j], dp[i][j-1]) + 1
其中,dp[i-1][j-1] 表示替换操作,将 word1 的第 i 个字符替换为 word2 的第 j 个字符;
dp[i-1][j] 表示删除操作,将 word1 的第 i 个字符删除;
dp[i][j-1] 表示插入操作,将 word2 的第 j 个字符插入到 word1 的第 i 个字符之前。
举个例子来说明,假设 word1 为 "horse",word2 为 "ros"。我们要求 dp[5][3],即将 word1 的前 5 个字符转换为 word2 的前 3 个字符。
(1) dp[i-1][j-1]:先将 word1 的前 4 个字符 "hors" 转换为 word2 的前 2 个字符 "ro",然后将第五个字符 word1[4](下标从 0 开始)由 'e' 替换为 's'(即替换为 word2 的第三个字符,word2[2])。
(2) dp[i][j-1]:先将 word1 的前 5 个字符 "horse" 转换为 word2 的前 2 个字符 "ro",然后在末尾补充一个 's',即插入操作。
(3) dp[i-1][j]:先将 word1 的前 4 个字符 "hors" 转换为 word2 的前 3 个字符 "ros",然后删除 word1 的第 5 个字符。
以上三种操作中,选择步数最小的操作数进行转换,并加上当前操作的步数(即 +1),即可得到 dp[5][3] 的最小步数。