题目大意:
给定两个字符串word1和word2,将word1转换为word2最少需要多少次操作?
操作分为三种:
- 插入一个字母 (insert)
- 删除一个字母 (delete)
- 替换一个字母 (replace)
Example 1:
1 | Input: word1 = "horse", word2 = "ros" |
Example 2:
1 | Input: word1 = "intention", word2 = "execution" |
Solution:
首先,我们定义状态:d[i][j]
表示将
word1[0...i)
转换为 word2[0...j)
所需要的最少次数。
对于基础情形,将一个字符串转换为空字符串需要的操作数:d[i][0] = i
, d[0][j] = j
。
对于一般情形,将 word1[0...i)
转换为
word2[0...j)
,我们将这个问题分解为子问题:
假设我们已经知道如何将 word1[0..i-1)
转换为
word2[0...j-1]
(即dp[i-1][j-1]
),
如果word1[i-1]==word2[j-1]
,那么不需要进行额外的操作,所以dp[i][j]=dp[i-1][j-1]
。
如果word1[i-1]!=word2[j-1]
,此时有三种情况:
- Replace: 将
word1[i-1]
替换为word2[j-1]
。 (dp[i][j] = dp[i-1][j-1] + 1
) - Delete:
如果
word1[0...i-1) == word2[0...j)
,那么删除word1[i-1]
。(dp[i][j] = dp[i-1][j] + 1
) - Insert:
如果
word1[0...i)+word2[j-1] == word2[0...j)
,那么在word1[0...i)
后面插入word2[j - 1]
。(dp[i][j] = dp[i][j-1] + 1
)
所以最终的dp[i][j]
为以上三种情况的最小值。
C++代码:
1 | class Solution { |