72 edit distance
·data-structure-and-algorithm
#dynamic-programming
72. 编辑距离
go:
func minDistance(word1, word2 string) int {
m := len(word2)
dp := make([]int, m+1)
// 空串 -> word2[:j]:插 j 次
for j := 0; j <= m; j++ {
dp[j] = j
}
for i := 0; i < len(word1); i++ {
x := word1[i]
// 本行的 dp[0]:把前 i+1 个字符变成空串,必须删 i+1 次
prev := dp[0] // 更新前的 dp[0],给 j=1 的“替换/对齐”用
dp[0] = i + 1
for j := 1; j <= m; j++ {
old := dp[j] // 还没用 x 之前的代价(支持“删”)
if x == word2[j-1] {
// 对齐到同一字符:直接承接“上一步的 j-1”
dp[j] = prev
} else {
// 三种操作取最小
del := old + 1 // 删 x
ins := dp[j-1] + 1 // 插 word2[j-1]
rep := prev + 1 // 换 x -> word2[j-1]
// 取最小
if del > ins { del = ins }
if del > rep { del = rep }
dp[j] = del
}
prev = old // 滚动“上一刻的 j”,给下一列当 prev
}
}
return dp[m]
}