- 思路
请返回将 word1 转换成 word2 所使用的最少操作数 。
func min(a, b int) int {
if a < b {
return a
}
return b
}
func minDistance(word1 string, word2 string) int {
w1Len, w2Len := len(word1), len(word2)
dp := make([][]int, w1Len + 1)
for i, _ := range dp {
dp[i] = make([]int, w2Len + 1)
}
// 初始化
for i := 0; i <= w1Len; i++ {
dp[i][0] = i
}
for j := 0; j <= w2Len; j++ {
dp[0][j] = j
}
// 三种操作:插入、删除、替换
// 在word1中插入相当于在word2中删除
for i := 1; i <= w1Len; i++ {
for j := 1; j <= w2Len; j++ {
if word1[i - 1] == word2[j - 1] {
dp[i][j] = dp[i - 1][j - 1]
} else {
// 删除:dp[i - 1][j] + 1删除word1中的word1[i - 1]
// 插入:dp[i][j - 1] + 1将word2[j - 1]插入word1,相当于删除word2[j - 1]
// 替换:dp[i - 1][j - 1] + 1,word1替换word1[i - 1],使其与word2[j - 1]相同,
// 此时不用增加元素,那么以下标i-2为结尾的word1与j-2为结尾的word2的最近编辑距离加上一个替换元素的操作
dp[i][j] = min(dp[i - 1][j - 1] + 1, min(dp[i - 1][j], dp[i][j - 1]) + 1)
}
}
}
return dp[w1Len][w2Len]
}