Leetcode72. 编辑距离
Leetcode72. 编辑距离
题目描述
给你两个单词 word1
和 word2
,请你计算出将 word1
转换成 word2
所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
- 插入一个字符
- 删除一个字符
- 替换一个字符
示例 1:
1 | 输入:word1 = "horse", word2 = "ros" |
示例 2:
1 | 输入:word1 = "intention", word2 = "execution" |
提示:
0 <= word1.length, word2.length <= 500
word1
和word2
由小写英文字母组成
解题思路
涉及两个字符串之间的最大最小问题第一反应就是能不能使用动态规划,但是怎么定义状态,以及如何求出状态转移方程比较困难。
先研究一下题目。我们对一个单词的操作可以有三种,分别为:
- 插入一个字符
- 删除一个字符
- 替换一个字符
那么两个单词A
和B
加起来就有就有六种方式。但是这六种方式有等价的操作:
-
对单词
A
删除一个字符和对单词B
插入一个字符是等价的; -
对单词
B
删除一个字符和对单词A
插入一个字符是等价的; -
对单词
A
替换一个字符和对单词B
替换一个字符是等价的。
也就是说只剩下了三种不同的操作:
- 在单词
A
中插入一个字符; - 在单词
B
中插入一个字符; - 修改单词
A
的一个字符。
现在我们研究一下如何用动态规划解决这个问题。如果我们定义为word1
中前i
个字符变换到word2
中前j
个字符所需要的最短操作次数,表示word1
中前i
个字符经过次最少操作变换到word2
中前j
个字符后的一个状态。那么状态是由变化而来的,也就是说的值跟有关系了。
- 如果由变化而来,那么只需在的基础上在单词
A
中插入一个字符,也就是说,存在等式:
- 如果由变化而来,那么只需在的基础上在单词
B
中插入一个字符,也就是说,存在等式:
- 如果由变化而来,还需要考虑
word1[i-1](word1的第i个字符)
和word2[j-1](word2的第j个字符
的值相等,则不需要任何操作;否则,修改单词A
的一个字符。也就是存在以下公式:
然后我们考虑一些特殊情况。
- 当
A
和B
都是空字符串的时候,也就是状态下,; - 当
A
或者B
有且只有一个为空的时候,只需要逐个删除非空字符串的字符就可。也就是说:
我们总结一下不难得到以下的动态规划条件:
\begin{eqnarray} && if \quad i=0 \quad 并且 \quad j=0,\quad dp[0][0]=0;\\\\ && if \quad i=0 \quad 并且 \quad j\neq 0,\quad dp[0][j]=j;\\\\ && if \quad i\neq 0 \quad 并且 \quad j=0,\quad dp[i][0]=i;\\\\ && if \quad i\neq 0 \quad 并且 \quad j\neq 0, \\\\ && dp[i][j]=min(dp[i][j-1]+1,dp[i-1][j]+1,dp[i-1][j-1]+1) ,\quad && if \quad word1[i-1] \neq word2[j-1];\\\\ && dp[i][j]=min(dp[i][j-1]+1,dp[i-1][j]+1,dp[i-1][j-1]), \quad && if \quad word1[i-1] = word2[j-1]; \end{eqnarray}据此可以写出对应代码,具体细节见示例代码:
1 | int minDistance(string word1, string word2) |
时间复杂度为:,和分别为word1
和word2
的长度;
空间复杂度为:,和分别为word1
和word2
的长度。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 二进制的叮当喵!