题目:编辑距离
力扣链接:72. 编辑距离 - 力扣(Leetcode)
解法
1、自顶向下解法: 使用了递归加备忘录的解法
var X [][]int
func minDistance(word1 string, word2 string) int {
n := len(word1)
m := len(word2)
X = make([][]int, n)
for i := 0; i < n; i++ {
X[i] = make([]int, m)
}
return tra(word1, n-1, word2, m-1)
}
func tra(word1 string, n int, word2 string, m int) int {
if n == -1 {
return m + 1
}
if m == -1 {
return n + 1
}
if X[n][m] != 0 {
return X[n][m]
}
if word1[n] == word2[m] {
X[n][m] = tra(word1, n-1, word2, m-1)
} else {
X[n][m] = Min(
tra(word1, n-1, word2, m),
tra(word1, n-1, word2, m-1),
tra(word1, n, word2, m-1)) + 1
}
return X[n][m]
}
func Min(a, b, c int) int {
m := a
if b < m {
m = b
}
if c < m {
m = c
}
return m
}
2、自底向上解法
func minDistance(word1 string, word2 string) int {
n := len(word1)
m := len(word2)
dp := make([][]int, n+1)
for i := range dp {
dp[i] = make([]int, m+1)
}
for i := 0; i <= n; i++ {
dp[i][0] = i
}
for i := 0; i <= m; i++ {
dp[0][i] = i
}
for i := 1; i <= n; i++ {
for j := 1; j <= m; j++ {
if word1[i-1] == word2[j-1] {
dp[i][j] = dp[i-1][j-1]
} else {
dp[i][j] = Min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1)
}
}
}
return dp[n][m]
}
func Min(a, b, c int) int {
m := a
if b < m {
m = b
}
if c < m {
m = c
}
return m
}