1、题目
2、题解
刚开始看到题目完全没有思路,就感觉到怕是要用动态规划,去看了题解,果然。。。
动态规划dp的内容真的很难确认啊,具体解题思路如下:
(1)dp[i][j]含义:word1的前i个字符和word2的前j个字符之间的最短距离
(2)初始化:dp[0][0]=0;dp[0][0:j]=j;dp[0:i][0]=i
(3)动态规划过程:
当word1[i]==word2[j] :dp[i][j]=min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1])
当word1[i]!=word2[j] :dp[i][j]=min(dp[i-1][j]+1, dp[i][j-1]+1, dp[i-1][j-1]+1)
最终实现代码如下
func minDistance(word1 string, word2 string) int {
word1B, word2B := []byte(word1), []byte(word2)
len1, len2 := len(word1), len(word2)
dp := make([][]int, len1+1)
for i:=range dp{
dp[i]=make([]int, len2+1)
}
//init
for i:=0; i<=len1; i++{
dp[i][0]=i
}
for j:=0; j<=len2; j++{
dp[0][j]=j
}
//State transition
for i:=1; i<=len1; i++{
for j:=1; j<=len2; j++{
if word1B[i-1]==word2B[j-1]{
dp[i][j]=1+getMin(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]-1)
}else{
dp[i][j]=1+getMin(dp[i-1][j], dp[i][j-1], dp[i-1][j-1])
}
}
}
return dp[len1][len2]
}
func getMin(a, b, c int) int{
min:=a
if min>b{
min=b
}
if min>c{
min=c
}
return min
}
提交结果如下