编辑距离 go 动态规划(自顶向下、自底向上)

402 阅读1分钟

题目:编辑距离

力扣链接: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
}