代码随想录训练营 DP

代码随想录训练营 DP

  • [583. 两个字符串的删除操作🌸](#583. 两个字符串的删除操作🌸)
  • [72. 编辑距离🌸](#72. 编辑距离🌸)

今天整理的东西都放在注释里了

583. 两个字符串的删除操作🌸

给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。

每步 可以删除任意一个字符串中的一个字符。

代码

go 复制代码
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
}

72. 编辑距离🌸

代码

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符

删除一个字符

替换一个字符

go 复制代码
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
}
相关推荐
Brilliantwxx20 分钟前
【C++】 深入理解红黑树:实现与原理全解
数据结构·c++·笔记·算法·青少年编程·红黑树
人道领域27 分钟前
【LeetCode刷题日记】108.将有序数组转换为二叉搜索树
java·算法·leetcode
Dlrb121141 分钟前
数据结构-排序算法
数据结构·算法·排序算法·插入排序·堆排序·希尔排序·快速排序
过期动态41 分钟前
【LeetCode 热题 100】无重复字符的最长子串
java·数据结构·spring boot·算法·leetcode·职场和发展
莫等闲-2 小时前
leetcode42. 接雨水 leetcode84.柱状图中最大的矩形
数据结构·c++·算法·leetcode
unicrom_深圳市由你创科技2 小时前
历史数据存储量太大,怎么处理?数据压缩/归档策略?
算法
浅念-2 小时前
LeetCode 记忆化搜索 刷题总结
数据结构·算法·leetcode·职场和发展·深度优先·dfs
菜菜的顾清寒2 小时前
力扣HOT100(44)对称二叉树
数据结构·算法·leetcode
吃好睡好便好2 小时前
矩阵的左乘和右乘
人工智能·学习·线性代数·算法·matlab·矩阵
我命由我123452 小时前
SEO 与 GEO 极简理解
java·linux·运维·开发语言·学习·算法·运维开发