首页 > 编程语言 >代码随想录算法训练营Day55 | 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇 | Python | 个人记录向

代码随想录算法训练营Day55 | 583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇 | Python | 个人记录向

时间:2024-05-30 18:58:47浏览次数:30  
标签:随想录 距离 编辑 range word1 len word2 字符串 dp

本文目录

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

代码随想录:583. 两个字符串的删除操作
Leetcode:583. 两个字符串的删除操作

做题

找出最长公共子序列,然后用两个字符串的长度和减去两倍最长公共子序列长度即可。

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        dp = [[0] * (len(word2) + 1) for _ in range(len(word1) + 1)]
        for i in range(1, len(word1)+1):
            for j in range(1, len(word2)+1):
                if word1[i-1] == word2[j-1]:
                    dp[i][j] = dp[i-1][j-1] + 1
                else:
                    dp[i][j] = max(dp[i-1][j], dp[i][j-1])
        return len(word1) + len(word2) - 2 * dp[len(word1)][len(word2)]

时间复杂度: O(n * m)
空间复杂度: O(n * m)

看文章

有直接求解的思路。dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        dp = [[0] * (len(word2)+1) for _ in range(len(word1)+1)]
        for i in range(len(word1)+1):
            dp[i][0] = i
        for j in range(len(word2)+1):
            dp[0][j] = j
        for i in range(1, len(word1)+1):
            for j in range(1, len(word2)+1):
                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] + 2, dp[i-1][j] + 1, dp[i][j-1] + 1)
        return dp[-1][-1]

时间复杂度: O(n * m)
空间复杂度: O(n * m)

72. 编辑距离

代码随想录:72. 编辑距离
Leetcode:72. 编辑距离

做题

无思路。

看文章

前期的铺垫都是为了这道题。
动规五部曲:

  1. 确定dp数组(dp table)以及下标的含义

    dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]。

  2. 确定递推公式

    编辑的几种操作:

    if (word1[i - 1] == word2[j - 1])
        不操作
    if (word1[i - 1] != word2[j - 1])
        增
        删
        换
    

    增、删:dp[i][j] = dp[i - 1][j] + 1、dp[i][j] = dp[i][j - 1] + 1
    换:dp[i][j] = dp[i - 1][j - 1] + 1

    几种操作取最小,就是递推公式。

  3. dp数组如何初始化

    dp[i][0] :以下标i-1为结尾的字符串word1,和空字符串word2,最近编辑距离为dp[i][0]。
    那么dp[i][0]就应该是i,对word1里的元素全部做删除操作,即:dp[i][0] = i; 同理dp[0][j] = j;

  4. 确定遍历顺序

  5. 举例推导dp数组

具体代码如下:

class Solution:
    def minDistance(self, word1: str, word2: str) -> int:
        dp = [[0] * (len(word2)+1) for _ in range(len(word1)+1)]
        for i in range(len(word1)+1):
            dp[i][0] = i
        for j in range(len(word2)+1):
            dp[0][j] = j
        for i in range(1, len(word1)+1):
            for j in range(1, len(word2)+1):
                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], dp[i-1][j]) + 1
        return dp[-1][-1]

时间复杂度: O(n * m)
空间复杂度: O(n * m)

编辑距离总结篇

代码随想录:编辑距离总结篇

以往忽略的知识点小结

  • 编辑距离是最后的汇总题,包含增、删、改这三种操作,增删可以理解为同一种

个人体会

完成时间:1h30min。
心得:编辑距离总结,把两字符之间的增删改解决了。

标签:随想录,距离,编辑,range,word1,len,word2,字符串,dp
From: https://blog.csdn.net/Xiu_Yuan123/article/details/139317764

相关文章

  • 树上点到路径/链的最短距离
    结论树上一个点\(x\)到路径\(u\rightarrowv\)的最短距离为:\[dep[x]+dep[\operatorname{lca}(u,v)]-dep[\operatorname{lca}(x,u)]-dep[\operatorname{lca}(x,v)]\]其中,\(dep\)为该点的深度,\(\operatorname{lca}\)为两点的最近公共祖先。证明我们提取出同时包含\(x,u,......
  • 【数学&代码】求两点之间的距离
    Hello!大家好,今天讲讲求两点之间的距离。已知点A的坐标为(x1,y1),点B的坐标为(x2,y2),求两点之间的直线距离。首先,我先讲明,要解决这个问题,需要用到勾股定理,没学过的小伙伴们先去学一下哈!【数学】勾股定理https://blog.csdn.net/yangyanbin_sam/article/details/138959059?spm=100......
  • 学完《编辑器扩展精讲》总结
    学完《编辑器扩展精讲》总结思维导图思维导图pos下载结构POS文件下载代码仓库gitee......
  • 代码随想录算法训练营第第22天 | 235. 二叉搜索树的最近公共祖先 、701.二叉搜索树中
    二叉搜索树的最近公共祖先相对于二叉树的最近公共祖先本题就简单一些了,因为可以利用二叉搜索树的特性。题目链接/文章讲解:https://programmercarl.com/0235.二叉搜索树的最近公共祖先.html视频讲解:https://www.bilibili.com/video/BV1Zt4y1F7ww/***@param{TreeNode}......
  • 代码随想录算法训练营第二十二天 | 235. 二叉搜索树的最近公共祖先、701.二叉搜索树中
    235.二叉搜索树的最近公共祖先题目链接:https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-search-tree/文档讲解:https://programmercarl.com/0235.%E4%BA%8C%E5%8F%89%E6%90%9C%E7%B4%A2%E6%A0%91%E7%9A%84%E6%9C%80%E8%BF%91%E5%85%AC%E5%85%B1%E7%A5%......
  • 59天【代码随想录算法训练营34期】第十章 单调栈part02( ● 503.下一个更大元素II ●
    503.下一个更大元素IIclassSolution:defnextGreaterElements(self,nums:List[int])->List[int]:dp=[-1]*len(nums)stack=[]foriinrange(len(nums)*2):while(len(stack)!=0andnums[i%len(nums)]>nums[stack[-1......
  • Blocs for mac(优秀的可视化代码编辑器)v5.2.4版
    BlocsMac版是一款优秀的的可视化Web开发工具,专为追求高效、直观且无需深厚编程知识就能创建现代化静态网站的用户设计。这款软件以其强大的可视化编辑界面和简易的操作流程,让用户无需深入了解复杂的代码编写,也能轻松构建出高质量、现代化的静态网站。Blocs不仅加速了网站开发......
  • DxO PhotoLab 6 for Mac(智能raw图片编辑器)v6.17.0.72版
    DxOPhotoLab6是一款专为Mac用户设计的照片编辑软件,旨在帮助用户轻松增强和优化他们的照片。它集成了丰富的工具集,涵盖了曝光、颜色、锐度和降噪等关键编辑需求。该软件尤其以其卓越的RAW处理技术著称,能够显著提升各种相机型号RAW文件的质量。此外,DxOPhotoLab6还提供了镜头......
  • ThinkEditor电子病历编辑器:一款优秀的原生电子病历编辑器
    设计理念信译(ThinkEditor)跨平台电子病历编辑器在技术端核心设计理念是跨平台和全结构化。在产品端的核心开发思想是实现医疗电子病历编辑器的全功能和低耦合。以产品创新为导向,以服务订制为宗旨提高合作厂商产品迭代速度,提升医疗产品竞争力,实现合作与共赢创新技术手段实......
  • 代码随想录算法训练营day7(哈希表)
    代码随想录算法训练营day7(哈希表):今天继续学习哈希表,对一些容器的语法操作我会在内容或者产出中说明,放上题目链接可以先试着自己做做看。学习内容:4543831518学习产出:454我的思路就是前两个vector为一组,后两个为另一组。构建两个map储存两组可能出现的sum值(两......