代码随想录算法训练营第五十八天 | 动态规划 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

相关文章

springboot循环依赖问题案例代码及解决办法

《springboot循环依赖问题案例代码及解决办法》在SpringBoot中,如果两个或多个Bean之间存在循环依赖(即BeanA依赖BeanB,而BeanB又依赖BeanA),会导致Spring的... 目录1. 什么是循环依赖?2. 循环依赖的场景案例3. 解决循环依赖的常见方法方法 1:使用 @La

使用C#代码在PDF文档中添加、删除和替换图片

《使用C#代码在PDF文档中添加、删除和替换图片》在当今数字化文档处理场景中,动态操作PDF文档中的图像已成为企业级应用开发的核心需求之一,本文将介绍如何在.NET平台使用C#代码在PDF文档中添加、... 目录引言用C#添加图片到PDF文档用C#删除PDF文档中的图片用C#替换PDF文档中的图片引言在当

C#使用SQLite进行大数据量高效处理的代码示例

《C#使用SQLite进行大数据量高效处理的代码示例》在软件开发中,高效处理大数据量是一个常见且具有挑战性的任务,SQLite因其零配置、嵌入式、跨平台的特性,成为许多开发者的首选数据库,本文将深入探... 目录前言准备工作数据实体核心技术批量插入:从乌龟到猎豹的蜕变分页查询:加载百万数据异步处理:拒绝界面

用js控制视频播放进度基本示例代码

《用js控制视频播放进度基本示例代码》写前端的时候,很多的时候是需要支持要网页视频播放的功能,下面这篇文章主要给大家介绍了关于用js控制视频播放进度的相关资料,文中通过代码介绍的非常详细,需要的朋友可... 目录前言html部分:JavaScript部分:注意:总结前言在javascript中控制视频播放

C#数据结构之字符串(string)详解

《C#数据结构之字符串(string)详解》:本文主要介绍C#数据结构之字符串(string),具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录转义字符序列字符串的创建字符串的声明null字符串与空字符串重复单字符字符串的构造字符串的属性和常用方法属性常用方法总结摘

C#如何动态创建Label,及动态label事件

《C#如何动态创建Label,及动态label事件》:本文主要介绍C#如何动态创建Label,及动态label事件,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C#如何动态创建Label,及动态label事件第一点:switch中的生成我们的label事件接着,

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

MyBatis 动态 SQL 优化之标签的实战与技巧(常见用法)

《MyBatis动态SQL优化之标签的实战与技巧(常见用法)》本文通过详细的示例和实际应用场景,介绍了如何有效利用这些标签来优化MyBatis配置,提升开发效率,确保SQL的高效执行和安全性,感... 目录动态SQL详解一、动态SQL的核心概念1.1 什么是动态SQL?1.2 动态SQL的优点1.3 动态S

Mysql表的简单操作(基本技能)

《Mysql表的简单操作(基本技能)》在数据库中,表的操作主要包括表的创建、查看、修改、删除等,了解如何操作这些表是数据库管理和开发的基本技能,本文给大家介绍Mysql表的简单操作,感兴趣的朋友一起看... 目录3.1 创建表 3.2 查看表结构3.3 修改表3.4 实践案例:修改表在数据库中,表的操作主要

C# WinForms存储过程操作数据库的实例讲解

《C#WinForms存储过程操作数据库的实例讲解》:本文主要介绍C#WinForms存储过程操作数据库的实例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、存储过程基础二、C# 调用流程1. 数据库连接配置2. 执行存储过程(增删改)3. 查询数据三、事务处