给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例 1:
1 | 输入: word1 = "horse", word2 = "ros" |
示例 2:
1 | 输入: word1 = "intention", word2 = "execution" |
思路:
背包问题,动态规划
设dp(i , j) 表示word1的前i个字符组成word2的前j个字符需要的最小步数。
那么结论如下:
if( word1[i] ==word2[j] ){
那么dp(i,j)=dp(i-1,j-1);
}else{
dp(i,j) = min{ dp(i-1,j-1) dp(i-1,j) dp(i,j-1) } + 1;
}
我们分析horse转ros
“” | h | ho | hor | hors | horse | |
---|---|---|---|---|---|---|
“” | 0 | 1 | 2 | 3 | 4 | 5 |
r | 1 | 1 | 2 | 2 | 3 | 4 |
ro | 2 | 2 | 1 | 2 | 3 | 4 |
ros | 3 | 3 | 2 | 2 | 2 | 3 |
我们很容易可以写出第一行跟第一列,之后一行一行的填充
word1[i] ==word2[j] 这种 case 很容易理解,
我们分析不等的case,比如 hor——》ros,
我们可以知道
- ho -> ro 最少需要1步就可以,那么hor->ros 我们只需要替换最后一位即可,
- hor -> ro最少需要2步,那么hor->ros,我们需要再插入最后一位
- ho -> ros最少需要2步,那么hor->ros,我们需要删除最后一位
我们选择其中最小的步数+1即可。
代码
1 | class Solution { |