代码随想录算法训练营Day56 | 动态规划(16/17) LeetCode 583. 两个字符串的删除操作 72. 编辑距离

2023-09-22 13:08:59

动态规划马上来到尾声了,当时还觉得动态规划内容很多,但是也这么过来了。

第一题

583. Delete Operation for Two Strings

Given two strings word1 and word2, return the minimum number of steps required to make word1 and word2 the same.

In one step, you can delete exactly one character in either string.

本题和LC 115 相比,其实就是两个字符串都可以删除了,情况虽说复杂一些,但整体思路是不变的

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]

第二题

72. Edit Distance

Given two strings word1 and word2, return the minimum number of operations required to convert word1 to word2.

You have the following three operations permitted on a word:

  • Insert a character
  • Delete a character
  • Replace a character

编辑距离是用动规来解决的经典题目,这道题目看上去好像很复杂,但用动规可以很巧妙的算出最少编辑距离。利用动态规划五部曲来做一个分析:

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])
    增
    删
    换
  1. if (word1[i - 1] == word2[j - 1]) 那么说明不用任何编辑,dp[i][j] 就应该是 dp[i - 1][j - 1],即dp[i][j] = dp[i - 1][j - 1];
  2. if (word1[i - 1] != word2[j - 1]),此时就需要编辑了,如何编辑呢?

    1. 操作一:word1删除一个元素,那么就是以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上一个操作。即 dp[i][j] = dp[i - 1][j] + 1;
    2. 操作二:word2删除一个元素,那么就是以下标i - 1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 再加上一个操作。即 dp[i][j] = dp[i][j - 1] + 1;
    3. 操作三:替换元素,word1替换word1[i - 1],使其与word2[j - 1]相同,此时不用增删加元素。

3. dp数组如何初始化

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

那么dp[i][0] 和 dp[0][j] 表示什么呢?

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

那么dp[i][0]就应该是i,对word1里的元素全部做删除操作,即:dp[i][0] = i;

同理dp[0][j] = j;

4. 确定遍历顺序

从如下四个递推公式:

  • dp[i][j] = dp[i - 1][j - 1]
  • dp[i][j] = dp[i - 1][j - 1] + 1
  • dp[i][j] = dp[i][j - 1] + 1
  • dp[i][j] = dp[i - 1][j] + 1

可以看出dp[i][j]是依赖左方,上方和左上方元素的。

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-1][j], dp[i][j-1]) + 1
        return dp[-1][-1]

更多推荐

el-select 下拉框全选、多选的几种方式组件

组件一、基础多选适用性较广的基础多选,用Tag展示已选项<template><el-selectv-model="value1"multipleplaceholder="请选择"><el-optionv-for="iteminoptions":key="item.value":label="item.label":va

windows批处理 将当前路径添加到Windows的`PATH`环境变量中 %~dp0

将当前路径添加到Windows的PATH环境变量中要将当前路径添加到Windows的PATH环境变量中,可以使用以下方法:使用命令行:打开命令提示符(CommandPrompt)或PowerShell,然后执行以下命令:setxPATH"%PATH%;C:\Your\Current\Directory"这会将当前路径(

【面试刷题】——C++四种类型转化

C++支持多种类型转换操作,其中包括四种主要类型转换方式:隐式类型转换(ImplicitConversion):隐式类型转换是自动发生的类型转换,由编译器自动完成。它用于处理不同数据类型之间的运算,例如将整数和浮点数相加时,整数会隐式地转换为浮点数。例如,将int转换为double或将float转换为int都是隐式类型

LinuxShell命令行及脚本编程实例详解_笔记

LinuxShell命令行及脚本编程实例详解Linux典藏大师系列丛书shell脚本的构成:1.shell关键字if...thenelse;for...done;whiledodone2.shell命令export,echo,exit,pwd,return3.linux命令datarmmkdircd4.文本处理功能aw

39 | selenium基础架构,UI测试架构

什么是测试基础架构?测试基础架构指的是,执行测试的过程中用到的所有基础硬件设施以及相关的软件设施。因此,我们也把测试基础架构称之为广义的测试执行环境。通常来讲,测试基础架构主要包括以下内容:执行测试的机器;测试用例代码仓库;发起测试执行的JenkinsJob;统一的测试执行平台;测试用例执行过程中依赖的测试服务,比如提

百望云获评ITShare数智未来创新峰会“年度数字化优秀服务商”大奖

近日,百望云应邀出席“新能源-新制造暨汽车数智未来创新峰会”,凭借在数字化领域优秀的服务能力和丰富的落地成果,成功获评“年度数字化优秀服务商”,这也是市场对百望云在赋能企业数字化转型和产品创新领域的再度认可!在“数智创新未来”的主题下,百望云也与众多行业知名企业分享了财税数字化转型成功经验,共襄盛会,齐瞻未来。数智未来

【Linux】Linux权限

目录一、认识Linux下的用户分类1.root和普通用户是怎样切换的如果我是普通用户,那我怎么变成root?如果我是root,那我怎么变成指定的普通用户?2.对某一指令进行暂时提权二、什么叫做权限三、没有权限的会出现什么现象三、修改权限通过二进制序列转换对权限进行加减修改文件所属组、拥有者其他问题1.为什么我们创建文件

【计算机网络】75 张图详解:网络设备、网络地址规划、静态路由(万字长文)

75张图详解:网络设备、网络地址规划、静态路由1.网络设备1.1交换机1.2路由器2.网络地址规划2.1IP地址2.2分类地址2.3子网掩码2.4无类地址2.5子网划分2.5.1示例一2.5.2示例二2.6超网合并3.静态路由3.1路由表3.2直连路由3.3静态路由3.4默认路由3.5网关和默认网关4.实战演练4.1静

网络爬虫——HTTP和HTTPS的请求与响应原理

目录一、HTTP的请求与响应二、浏览器发送HTTP请求的过程三、HTTP请求方法四、查看网页请求五、常用的请求报头六、服务端HTTP响应七、常用的响应报头八、Cookie和Session九、响应状态码十、网页的两种加载方法十一、认识网页源码的构成十二、爬虫协议在如今这个数据驱动的时代,网络爬虫在数据采集、信息抓取和处理

【大数据开发技术】实验04-HDFS文件创建与写入

文章目录一、实验目标二、实验要求三、实验内容四、实验步骤一、实验目标熟练掌握hadoop操作指令及HDFS命令行接口掌握HDFS原理熟练掌握HDFS的API使用方法掌握单个本地文件写入到HDFS文件的方法掌握多个本地文件批量写入到HDFS文件的方法二、实验要求给出主要实验步骤成功的效果截图。要求分别在本地和集群测试,给

@DateTimeFormat 和 @JsonFormat 的详细研究

关于这两个时间转化注解,先说结论一、介绍1、@DateTimeFormat@DateTimeFormat并不会根据得到其属性pattern把前端传入的数据转换成自己想要的格式,而是将前端的String类型数据封装到Date类型;其次它的pattern属性是用来规范前端传入数据的格式@DateTimeFormat它用于前

热文推荐