今天整理的东西都放在注释里了
给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。
func minDistance(w1 string, w2 string) int {
//删除
//dp[i][j] == 以i-1 结尾的字符串word1,j-1结尾的字符串word2,想要相等所需要删除的最少次数
// w1[i-1] == w2[j-1] ==> dp[i][j] = dp[i-1][j]
// w1[i-1] != w2[j-1] ==>
// 1、 dp[i][j] == dp[i-1][j] + 1
// 2、 dp[i][j] == dp[i][j-1] + 1
// 3、 dp[i][j] == dp[i-1][j-1] + 2
// min(1,2,3)
// 同时删word1[i - 1]和word2[j - 1],dp[i][j-1] 就不需要 word2[j - 1]
//初始化:dp[i][0] dp[0][j] 需要初始化
//dp[i][0]:word2为空字符串,以i-1为结尾的字符串word1要删除多少个元素,才能和word2相同呢,很明显dp[i][0] = i。dp[0][j]的话同理
//遍历顺序 根据递推公式来看
dp:=make([][]int,len(w1)+1)
for i:=0;i<len(dp);i++{
dp[i]=make([]int,len(w2)+1)
}
for i:=0;i<len(dp);i++{
dp[i][0]=i
}
for i:=0;i<len(dp[0]);i++{
dp[0][i]=i
}
for i:=1;i<len(dp);i++{
for j:=1;j<len(dp[i]);j++{
if w1[i-1] ==w2[j-1]{
dp[i][j]=dp[i-1][j-1]
}else{
dp[i][j] = min(min(dp[i-1][j]+1, dp[i][j-1]+1),dp[i-1][j-1]+2)
}
}
}
return dp[len(dp)-1][len(dp[0])-1]
}
func min(a, b int) int{
if a>b{
return b
}
return a
}
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
func minDistance(w1 string, w2 string) int {
//dp[i][j]:= 以下标i-1 j-1 结尾的字符串的最近编辑距离
// if(w1[i-1]) == w2(j-1) dp[i][j] = dp[i - 1][j - 1]
// if(w1[i-1]) != w2(j-1) add delete update
// delete dp[i][j] = i-2 与j-1 比较 = dp[i-1][j] +1
// word2添加一个元素,相当于word1删除一个元素
//dp[i][j] = dp[i][j - 1] + 1
//替换元素,word1替换word1[i - 1],使其与word2[j - 1]相同,此时不用增删加元素。
//dp[i][j] = dp[i - 1][j - 1] + 1;
l1,l2:=len(w1),len(w2)
dp:=make([][]int,l1+1)
for i:= range dp{
dp[i] = make([]int,l2+1)
}
for i:=0;i<l1+1;i++{
dp[i][0] =i
}
for j:=0;j<l2+1;j++{
dp[0][j] = j
}
for i:=1;i<l1+1;i++{
for j:=1;j<l2+1;j++{
if w1[i-1] == w2[j-1]{
dp[i][j] = dp[i-1][j-1]
}else{
dp[i][j] = min(dp[i][j-1],dp[i-1][j],dp[i-1][j-1]) +1
}
}
}
return dp[l1][l2]
}
func min(args ...int) int {
min := args[0]
for _, item := range args {
if item < min {
min = item
}
}
return min
}