【leetcode】72. 编辑距离问题
距离上次更新本文已经过去了 197 天,文章部分内容可能已经过时,请注意甄别
leetcode 刷题笔记 - 72. 编辑距离问题
问题
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例
plaintext
1 | 示例 1: |
提示:
plaintext
1 | 0 <= word1.length, word2.length <= 500 |
思路
这道题基于 583. 两个字符串的删除操作上,将只可以删除一个字符改成了可以进行删除、替换、插入操作。但本质还是两个字符串进行比较,所以大部份代码都是一模一样的,只有比较时两个字符不相同的时候的操作才有区别。
首先是定义 dp 数组,还是采用常用的定义方式
dp[i][j]
:将字符串 1 的 i 之前和字符串 2 的 j 之前变成相同字符串的最少操作次数。
然后是确定 dp 数组的递推,首先是 word1[i-1]
和 word2[j-1]
相同和不相同这两种大情况
- 当
word1[i-1] == word2[j-1]
,相当于不需要进行操作,dp[i][j]=dp[i-1][j-1]
; - 当
word[i-1] != word2[j-1]
,就需要进行编辑修改了;
当二者不同的时候,有多种方式进行修改,题目给出的是删除、替换、插入。但其实插入和删除是等价的!给出下面这两个字符串
plaintext
1 | word1="a" word2="ab" |
假设我们进行删除,可以从 word2 中删除 b 字符,操作数是 1;而进行插入是给 word1 插入一个字符 b,操作数也是 1。二者的操作数相同,那么递推公式也就相同,所以插入和删除可以认为是一种操作方式!
和 583 题不同的点就在于有一个替换的操作方式,当两个字符不同的时候,我们可以直接替换其中一个字符串中的字符,替换后两个字符就相等了,也就变成了 word1[i-1] == word2[j-1]
的情况,dp[i][j]==dp[i-1][j-1]+1
;
最终的递推方案如下
cpp
1 | if (word1[i-1] == word2[j-1]) { |
但实际上,这里完全可以省略 583 题目中两个字符串中都删除字符的操作,因为它的值很明显比替换字符需要的操作数多一次,进行 min 计算是没有意义的。
初始化和遍历方式都和 583 题目完全一样,可以去看站内之前写的 583 题目的题解,这里就不赘述了。
代码
完整代码如下
cpp
1 | class Solution { |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 慕雪的寒舍!
评论
表情图片预览
0 条评论
- 最新
- 最热
- 最早
- 作者
关闭评论
通知中心
「此时无声胜有声」
Artalk ErrorTypeError: Failed to fetch,无法获取评论列表数据
点击重新获取 | 打开控制台
点击重新获取 | 打开控制台