代码随想录算法训练营第五十八天 | 动态规划 part 16 | 583. 两个字符串的删除操作、72. 编辑距离

本文主要是介绍代码随想录算法训练营第五十八天 | 动态规划 part 16 | 583. 两个字符串的删除操作、72. 编辑距离,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

  • 583. 两个字符串的删除操作
    • 思路
    • 思路2
    • 代码
  • 72. 编辑距离
    • 思路
    • 代码

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

Leetcode

在这里插入图片描述

思路

  1. dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数。
  2. 递推公式:
    • 当word1[i - 1] 与 word2[j - 1]相同的时候
      • dp[i][j] = dp[i - 1][j - 1]
    • 当word1[i - 1] 与 word2[j - 1]不相同的时候
      • 删word1[i - 1],最少操作次数为dp[i - 1][j] + 1
      • 删word2[j - 1],最少操作次数为dp[i][j - 1] + 1
      • 同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2
      • 总的来说就是取最小值,所以是dp[i][j] = min(dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1)
      • 因为 dp[i][j - 1] + 1 = dp[i - 1][j - 1] + 2,所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1)
  3. 初始化:dp[i][0]:word2为空字符串,以i-1为结尾的字符串word1要删除多少个元素,才能和word2相同呢,很明显dp[i][0] = i。dp[0][j]的话同理
  4. 从上到下,从左到右
  5. 以word1:“sea”,word2:"eat"为例,推导dp数组状态图如下:
    在这里插入图片描述

思路2

和1143.最长公共子序列 基本相同,只要求出两个字符串的最长公共子序列长度即可,那么除了最长公共子序列之外的字符都是必须删除的,最后用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数。

代码

思路一

class Solution:def minDistance(self, word1: str, word2: str) -> int:dp = [[0] * (len(word1) + 1) for _ in range(len(word2) + 1)]for i in range(len(word2) + 1):dp[i][0] = ifor j in range(len(word1) + 1):dp[0][j] = jfor i in range(1, len(word2) + 1):for j in range(1, len(word1) + 1):if word1[j - 1] == word2[i - 1]:dp[i][j] = dp[i - 1][j - 1]else:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1)return dp[-1][-1]
  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n * m)

72. 编辑距离

Leetcode

在这里插入图片描述

思路

  1. dp数组含义: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])增删换
    
    • 不操作:无需编辑,直接取去掉i-1, j-1的最小编辑距离 dp[i][j] = dp[i - 1][j - 1]
    • 增和删本质上是一样的,同一种操作的正反向,可以是删word1的元素,也可以是删word2的元素
      • 删掉word1 i-1 元素的最小编辑距离:dp[i][j] = dp[i - 1][j ] + 1
      • 删掉word2 j-1 元素的最小编辑距离:dp[i][j] = dp[i][j - 1] + 1
    • 替换:
      • 首先我们要明白为什么替换不能被删除给替代。举个例子“abc”和“abg”,如果分别删除“c”和“g”的话需要两步操作,但是如果替换“c”为“g”的话只需要一步。
      • 所以替换的递推公式就是在“ab”和“ab”两个子串的最小编辑距离上加一
      • 具体为dp[i][j] = dp[i - 1][j - 1] + 1
  3. 初始化:
    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. 举例推导:以示例1为例,输入:word1 = “horse”, word2 = "ros"为例,dp矩阵状态图如下:
    在这里插入图片描述

代码

class Solution:def minDistance(self, word1: str, word2: str) -> int:dp = [[0] * (len(word1) + 1) for _ in range(len(word2) + 1)]for i in range(len(word2) + 1):dp[i][0] = ifor j in range(len(word1) + 1):dp[0][j] = jfor i in range(1, len(word2) + 1):for j in range(1, len(word1) + 1):if word2[i - 1] == word1[j - 1]:dp[i][j] = dp[i - 1][j - 1]else:dp[i][j] = min(dp[i - 1][j], dp[i - 1][j - 1], dp[i][j - 1]) + 1return dp[-1][-1]
  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n * m)

这篇关于代码随想录算法训练营第五十八天 | 动态规划 part 16 | 583. 两个字符串的删除操作、72. 编辑距离的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/156361

相关文章

Mysql实现范围分区表(新增、删除、重组、查看)

《Mysql实现范围分区表(新增、删除、重组、查看)》MySQL分区表的四种类型(范围、哈希、列表、键值),主要介绍了范围分区的创建、查询、添加、删除及重组织操作,具有一定的参考价值,感兴趣的可以了解... 目录一、mysql分区表分类二、范围分区(Range Partitioning1、新建分区表:2、分

MySQL 删除数据详解(最新整理)

《MySQL删除数据详解(最新整理)》:本文主要介绍MySQL删除数据的相关知识,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录一、前言二、mysql 中的三种删除方式1.DELETE语句✅ 基本语法: 示例:2.TRUNCATE语句✅ 基本语

C# 比较两个list 之间元素差异的常用方法

《C#比较两个list之间元素差异的常用方法》:本文主要介绍C#比较两个list之间元素差异,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录1. 使用Except方法2. 使用Except的逆操作3. 使用LINQ的Join,GroupJoin

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

mysql表操作与查询功能详解

《mysql表操作与查询功能详解》本文系统讲解MySQL表操作与查询,涵盖创建、修改、复制表语法,基本查询结构及WHERE、GROUPBY等子句,本文结合实例代码给大家介绍的非常详细,感兴趣的朋友跟随... 目录01.表的操作1.1表操作概览1.2创建表1.3修改表1.4复制表02.基本查询操作2.1 SE

一文详解Git中分支本地和远程删除的方法

《一文详解Git中分支本地和远程删除的方法》在使用Git进行版本控制的过程中,我们会创建多个分支来进行不同功能的开发,这就容易涉及到如何正确地删除本地分支和远程分支,下面我们就来看看相关的实现方法吧... 目录技术背景实现步骤删除本地分支删除远程www.chinasem.cn分支同步删除信息到其他机器示例步骤

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性: