题目描述
给你两个单词 word1
和 word2
, 请返回将 word1
转换成 word2
所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
示例 1:
- 输入:word1 = “horse”, word2 = “ros”
- 输出:3
- 解释:
- horse -> rorse (将 ‘h’ 替换为 ‘r’)
- rorse -> rose (删除 ‘r’)
- rose -> ros (删除 ’e’)
示例 2:
- 输入:word1 = “intention”, word2 = “execution”
- 输出:5
- 解释:
- intention -> inention (删除 ’t')
- inention -> enention (将 ‘i’ 替换为 ’e’)
- enention -> exention (将 ’n’ 替换为 ‘x’)
- exention -> exection (将 ’n’ 替换为 ‘c’)
- exection -> execution (插入 ‘u’)
提示:
0 <= word1.length, word2.length <= 500
word1
和 word2
由小写英文字母组成
解法一:动态规划
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
|
func min(nums ...int) int {
res := nums[0]
for _, val := range nums {
if val < res {
res = val
}
}
return res
}
func minDistance(word1 string, word2 string) int {
h, w := len(word1)+1, len(word2)+1
dp := make([][]int, h)
for i := 0; i < h; i++ {
dp[i] = make([]int, w)
}
for i := 0; i < h; i++ {
dp[i][0] = i
}
for j := 0; j < w; j++ {
dp[0][j] = j
}
for i := 1; i < h; i++ {
for j := 1; j < w; j++ {
if word1[i-1] == word2[j-1] {
dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]-1)
} else {
dp[i][j] = 1 + min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])
}
}
}
return dp[h-1][w-1]
}
|