• 代码随想录训练营 DP


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

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

    给定两个单词 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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44

    72. 编辑距离🌸

    代码

    给你两个单词 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
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
  • 相关阅读:
    Linux安装 vmware workstation
    基于minist数据集用VAE训练生成图片(VAE基础入门学习)
    Python爬虫实战第一例【一】
    Mybatis知识点讲解 【笔记】
    【嵌入式】嵌入式开发为什么要跑操作系统?
    Nginx 如何做流量拷贝
    算法通关村-----链表中环的问题
    语法基础(函数)
    将Vue项目部署在Nginx,解决前端路由、反向代理和静态资源问题
    python记录-01
  • 原文地址:https://blog.csdn.net/qq_41722524/article/details/133015182