编辑距离问题
题目描述:
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:* 插入一个字符* 删除一个字符* 替换一个字符示例:输入: word1 = "horse", word2 = "ros"输出: 3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')
解题
设置`dp[][]`,元素`dp[i][j]`表示单词`word1[0...i]`到单词`word2[0...j]`的编辑距离。<br /> 使用动态规划的关键在于:<br /> 既然元素`dp[i][j]`是最优子结构,那么`word1[i]`要么发生了替换,要么插入,删除,或者匹配。
- 如果
dp[i][j]的最优解是通过删除word1[i]来达到的,那么dp[i - 1][j]作为最优子结构,它的值一定是dp[i][j] - 1。可以使用反证法来证明。 其他的情况(插入,匹配,替换)类似。
状态转移为:
```
// 有四种情况
dp[i][j] = min {
dp[i - 1][j - 1], // 匹配
dp[i - 1][j - 1] + 1, // 替换
dp[i][j - 1] + 1, // 在word1[i]后方插入
dp[i - 1][j] + 1, // 删除
};
```
