题目描述
给你两个单词 word1 和 word2,请返回将 word1 转换成 word2 所使用的最少操作数。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例
示例 1:
1 | 输入:word1 = "horse", word2 = "ros" |
示例 2:
1 | 输入:word1 = "intention", word2 = "execution" |
提示
0 <= word1.length, word2.length <= 500word1和word2由小写英文字母组成
解题思路
这是一道经典的动态规划问题。
核心思想
定义 dp[i][j] 表示:将 word1[0:i] 转换成 word2[0:j] 的最少操作数。
换句话说,就是word1 前 i 个字符 变成 word2 前 j 个字符
状态转移方程
对于当前位置 dp[i][j],我们需要考虑以下四种情况:
删除操作:删除
word1的第i个字符(即word1[i-1])
$$dp[i][j] = dp[i-1][j] + 1$$插入操作:在
word1中插入word2的第j个字符(即word2[j-1])
$$dp[i][j] = dp[i][j-1] + 1$$替换操作:
word1[i-1]与word2[j-1]不匹配,需要替换
$$dp[i][j] = dp[i-1][j-1] + 1$$无需操作:
word1[i-1]与word2[j-1]匹配,无需任何操作
$$dp[i][j] = dp[i-1][j-1]$$
综合以上情况:
$$
dp[i][j] =
\begin{cases}
dp[i-1][j-1] & \text{当 } word1[i-1] = word2[j-1] \
\min(dp[i-1][j] + 1, dp[i][j-1] + 1, dp[i-1][j-1] + 1) & \text{当 } word1[i-1] \neq word2[j-1]
\end{cases}
$$
边界条件
- 当
i为 0 时,dp[0][j]表示将空字符串转换为word2[0:j],需要进行j次插入操作。 - 当
j为 0 时,dp[i][0]表示将word1[0:i]转换为空字符串,需要进行i次删除操作。
代码实现
1 | class Solution: |