代码随想录训练营第55天|LeetCode 583. 两个字符串的删除操作、72. 编辑距离

news2025/2/2 20:43:48

参考

代码随想录

题目一:LeetCode 583. 两个字符串的删除操作

  1. 确定dp数组下标及其含义
    为了方便dp数组的初始化,在整个分析问题的过程中在word1和word2的最前面添加空字符,注意,不是真正的添加,只是这么认为。
    dp[i][j]:word1中的0~i字符和word2中的0~j字符相等的最少删除次数。

  2. 确定递推公式

  • 如果word1[i] == word2[j],则dp[i][j] = dp[i-1][j-1],因为word1[i]和word2[j]已经相等,所以这两个字符不需要删除,只需要对前0~i-1个字符和0~j-1个字符进行匹配就可以了。
  • 如果word1[i] != word2[j],则dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + 1,因为此时有两种方式,一种是删除word[i],即dp[i][j] = dp[i-1][j] + 1,另一种是删除word2[j],即dp[i][j] = do[i][j-1] + 1.
  1. 初始化dp数组
    在之前已经说过,在求解过程中在word1和word2前面添加空字符,这样利于初始化,添加空字符后的初始化如下图所示:
    在这里插入图片描述
    代码实现如下:
vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1));
for(int i = 0; i <= word1.size(); i++)  dp[i][0] = i;
for(int j = 0; j <= word2.size(); j++)  dp[0][j] = j;

如果没有空字符,则初始化如下图所示:
在这里插入图片描述
代码实现如下:

vector<vector<int>> dp(word1.size(),vector<int>(word2.size()));
bool flag;
dp[0][0] = word1[0] == word2[0] ? 0 : 2;
flag = word1[0] == word2[0] ? true : false;
for(int i = 1; i < word1.size(); i++){
    if(word1[i] == word2[0])    flag = true;
    if(flag == true)    dp[i][0] = i;
    else    dp[i][0] = i + 2;
}
flag = word1[0] == word2[0] ? true : false;
for(int j = 1; j < word2.size(); j++){
    if(word1[0] == word2[j])    flag = true;
    if(flag == true)    dp[0][j] = j;
    else    dp[0][j] = j + 2;
}

可以看出,没有空字符时初始化过程要复杂得多。当然,添加空字符的好处也仅仅是在初始化上,在遍历过程中两种都是一样的。

  1. 确定遍历顺序
    从左到右,从上到下遍历。

  2. 举例推导dp数组在这里插入图片描述
    完整的代码实现如下:

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size()+1,vector<int>(word2.size()+1));
        for(int i = 0; i <= word1.size(); i++)  dp[i][0] = i;
        for(int j = 0; j <= word2.size(); j++)  dp[0][j] = j;
        for(int i = 1; i <= word1.size(); i++){
            for(int j = 1; j <= word2.size(); j++){
                if(word1[i-1] == word2[j-1])
                    dp[i][j] = dp[i - 1][j - 1];
                else
                    dp[i][j] = min(dp[i-1][j],dp[i][j-1]) + 1;
            }
        }
        return dp.back().back();
    }
};

题目二:LeetCode 72. 编辑距离

  1. 确定dp数组下标及其含义
    和上一个题一样,两个字符串添加空字符,方便初始化。
    dp[i][j]:子串1(word1中的0~i字符构成的字符串,包含i)转换成子串2(word2中的0~j字符构成的字符串,包含j)需要的最少操作数为dp[i][j]。

  2. 确定递推公式
    如果word1[i] == word2[j],则dp[i][j] = dp[i-1][j-1],这很好理解,当前的两个字符已经相等,因此变换次数和之前的一致。
    如果word1[i] != word2[j],则可以有增加、删除和替换三种操作,如下图所示:
    在这里插入图片描述
    上图中的阴影区域处,word1[i] = ‘r’ != word2[j] = ‘s’,此时对应的子串1为"hor",子串2为"ros",有三种方式将子串1变换为子串2。图中标注的1表示的是增加操作,从"hor"变为"ro"已经知道最少需要dp[i][j-1]次,只要在"ro"后面增加字符s,就可以得到"ros",因此增加操作需要dp[i][j-1]操作;图中标注的2是替换操作,将"ho"变换为"ro"需要dp[i-1][j-1]次,只需要将"hor"末尾的’r’替换为’s’就可以得到’ros’,因此替换操作需要dp[i-1][j-1] + 1次操作;图中标注的3是删除操作,"ho"到"ros"需要dp[i-1][j]次操作,现在从"hor"到"ros"只需要删除末尾的’r’即可,因此删除操作需要dp[i-1][j] + 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;
  1. 初始化dp数组
    根据递推公式,需要初始化dp数组的第0行和第0列,代码如下:
vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));
for(int i = 0; i <= word1.size(); i++)   dp[i][0] = i;
for(int j = 0; j <= word2.size(); j++)   dp[0][j] = j;
  1. 确定遍历顺序
    根据递推公式,从左到右,从上到下遍历即可。

  2. 举例推导dp数组
    在这里插入图片描述
    完整的代码实现如下:

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1));
        for(int i = 0; i <= word1.size(); i++)   dp[i][0] = i;
        for(int j = 0; j <= word2.size(); j++)   dp[0][j] = j;
        for(int i = 1; i <= word1.size(); i++){
            for(int j = 1; j <= word2.size(); j++){
                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.back().back();
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103943.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

大学英语笔记

words in use unit 1 The mayor condenseIt was reported exceedresearchers put deficittoo much————exposuremoving forward managerialthe lawyer adequateto help the competentmost parents&#xff0c;&#xff0c;&#xff0c;adjustingyou can count preciselyin …

工控CTF之协议分析8——特殊隧道

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、…

Python爬虫学习

文章目录前言概述简单爬虫requests模块⼊⻔数据解析re解析re模块总结前言 本博客仅做学习笔记&#xff0c;如有侵权&#xff0c;联系后即刻更改 科普&#xff1a; 学习参考网站 概述 安全 爬⾍在法律上是不被禁⽌的 像王欣说过,技术是⽆罪的. 主要看你⽤它来⼲嘛 robots.tx…

经纬恒润以太网开发及测试方案,助力智能汽车落地

近年来&#xff0c;为了满足智能网联汽车的开发要求&#xff0c;车载以太网技术开始逐渐进入人们的视野。车载以太网可以满足带宽密集型应用如高级驾驶辅助系统&#xff08;ADAS&#xff09;、车载诊断系统&#xff08;OBD&#xff09;以及车载信息娱乐系统等所需的更高数据传输…

controlsfx框架NotificationPane组件的使用

controlsfx 是javaFx开源UI框架&#xff0c;里面有很多默认组件的补充&#xff0c;最近在使用其中的NotificationPane组件时&#xff0c;遇到一些问题&#xff0c;记录下来。 官方demo链接&#xff1a; https://github.com/controlsfx/controlsfx/blob/jdk-8/controlsfx-samp…

Unittest接口自动化分享

一、环境搭建 1. Python安装 1. 1Python&#xff08;3.6.8版本&#xff09; 下载地址 https://www.python.org/downloads/release/python-368/ 1.1.1 Windows系统 1. 下载1. 对前缀的说明&#xff1a;​ 以Windows x86-64开头的是 64 位的 Python 安装程序&#xff1b;​ …

Ubuntu+Qt下配置车牌识别系统EasyPR1.6环境

1.将EasyPR_v1.6.zip拷贝到虚拟机Ubuntu中 最好是在opt文件夹中 &#xff0c;可使用 VMware tools 共享文件夹 远程连接工具 2.解压得到EasyPR文件夹 修改文件权限 chmod -R 777 EasyPR 3.查找/opt/EasyPR/include/easypr/config.h中 这边告诉我们&#xff0c;如果open…

【RL数学基础】概率论的基本概念:随机变量、概率密度函数、期望、随机抽样

文章目录1.随机变量&#xff08;Random Variable&#xff09;2.概率密度函数&#xff08;Probability Density Function, PDF&#xff09;3.期望&#xff08;Expectation&#xff09;4.随机抽样&#xff08;Random Sampling&#xff09;1.随机变量&#xff08;Random Variable&…

新一代免费开源大型企业数智制造解决方案

国家加速推进信创产业的开源自主可控 信创产业&#xff0c;即信息技术应用创新产业&#xff0c;其包含了从信息化基础设施到底层系统&#xff0c;再到上层的应用软件&#xff0c;与信息化建设过程中涉及有关的全产业链都必须安全与可控。信创产业涉及到的领域包括信息化基础设施…

编译安装nmon

nmon 是什么&#xff1f; nmon&#xff08;Nigel’s performance Monitor for Linux&#xff09;是一种Linux性能监视工具&#xff0c;当前它支持 Power/x86/x86_64/Mainframe/ARM 这五种 CPU 架构的 Linux&#xff0c;能将监控到的数据保存为 JSON 格式便于其他工具进行分析和…

【探索Spring底层】13.深入DispatcherServlet

文章目录1. DispatcherServlet概述2. DispatcherServlet的初始化时机3. DispatcherServlet初始化执行的操作4. RequestMappingHandlerMapping 基本用途5. RequestMappingHandlerAdapter 基本用途6. 参数和返回值解析器1. DispatcherServlet概述 DispatcherServlet是SpringMVC的…

AMS启动流程——APP启动过程

AMS流程图 基本慨念 1.zygote zygote意为“受精卵“。Android是基于Linux系统的&#xff0c;而在Linux中&#xff0c;所有的进程都是由init进程直接或者是间接fork出来的&#xff0c;zygote进程也不例外。 在Android系统里面&#xff0c;zygote是一个进程的名字。Android是基…

Effective C++(三):资源管理

个人读书记录&#xff0c;不适用教学内容。 目录 条款13&#xff1a;以对象管理资源 条款14&#xff1a;在资源管理类中小心copying行为 条款15&#xff1a;在资源管理类中提供对原始资源的访问 条款16&#xff1a;成对使用new和delete时要采取相同形式 条款17&#xff1a…

cubeIDE开发, STM32实时时钟(RTC)写入及读取日历时间开发要点

一、RTC简介 实时时钟的缩写是RTC(Real_Time Clock)&#xff0c;核心是晶振&#xff0c;晶振频率一般为32768 Hz 。它为分频计数器提供精确的与低功耗的实基信号。它可以用于产生秒、分、时、日等信息。为了确保时钟长期的准确性&#xff0c;晶振必须正常工作&#xff0c;不能够…

中小企业的公司财务管理系统

开发工具(eclipse/idea/vscode等)&#xff1a; 数据库(sqlite/mysql/sqlserver等)&#xff1a; 功能模块(请用文字描述&#xff0c;至少200字)&#xff1a; 本课题研究对象是中小企业财务管理系统&#xff0c;设计采用自己开发实践和所学知 识&#xff0c;系统部分主要分为以下…

【圣诞树代码】送她六棵圣诞树,祝她圣诞快乐~(送女朋友必备!)

“ 六棵圣诞树&#xff0c;满足她圣诞愿望 ” 距离25号圣诞节只有几天了&#xff0c;程序员有属于程序员的浪漫&#xff0c;这不来了~ 如果一颗圣诞树不够&#xff0c;那就送她六棵&#xff0c;祝她圣诞快乐~ 直接上效果图—— 01 02 03 04 05 06 代码如下&#xff1a; 第…

[1184]FinalShell下载安装

文章目录FinalShell介绍初步使用更换背景图连接记录删除FinalShell介绍 官网&#xff1a;http://www.hostbuf.com/ http://www.hostbuf.com/?install_fs FinalShell 简介&#xff1a; FinalShell 相当于 xshell ftp 的组合&#xff0c;即&#xff1a;FinalShell xshell f…

【计算机考研408】中断处理流程

中断请求 中断源是请求CPU中断的设备或事件&#xff0c;一台计算机允许有多个中断源。每个中断源向CPU发出中断请求的时间是随机的。 中断响应判优 中断响应优先级是指CPU响应中断请求的先后顺序。当多个中断源同时提出请求时&#xff0c;需通过中断判优逻辑来确定响应哪个中…

Python asyncore socket客户端开发基本使用

目录 介绍 1.定义类并且继承 asyncore.dispatcher 2.实现类中的回调代码 调用父类方法 创建 socket 对象 连接服务器 3.创建对象并且执行 asyncore.loop 进入运行循环 服务端示例代码 运行结果 注意&#xff1a; 介绍 asyncore库是python的一个标准库&#xff0c;提…

作为程序员,你离拿offer就差这个免费且好用的简历制作工具

为什么你的简历总是石沉大海&#xff1f;为什么你投递的岗位迟迟得不到回应&#xff1f;除了岗位招满、HR没看到以及竞争太激烈等客观因素外&#xff0c;最重要的是——“简历”出现了问题。 “简历”就像名片一样&#xff0c;在面试和求职的过程中&#xff0c;一份优质的简历…