代码随想录算法训练营第五十六天|583. 两个字符串的删除操作、72. 编辑距离、编辑距离总结篇

news2024/11/29 9:51:27

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

文档讲解 : 代码随想录 - 583. 两个字符串的删除操作
状态:再次回顾。

动态规划五部曲:

  1. 确定dp数组(dp table)以及下标的含义
    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 - 1] + 1 = dp[i - 1][j - 1] + 2,所以递推公式可简化为:dp[i][j] = min(dp[i - 1][j] + 1, dp[i][j - 1] + 1);
  3. dp数组如何初始化
    从递推公式中,可以看出dp[i][0]dp[0][j]要初始化。
    dp[i][0]word2为空字符串,以i-1为结尾的字符串word1要删除多少个元素,才能和word2相同呢,很明显dp[i][0] = idp[0][j]的话同理,所以代码如下:

    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;
    
  4. 确定遍历顺序
    从递推公式 dp[i][j] = min(dp[i - 1][j - 1] + 2, min(dp[i - 1][j], dp[i][j - 1]) + 1);dp[i][j] = dp[i - 1][j - 1]可以看出dp[i][j]都是根据左上方、正上方、正左方推出来的。
    遍历顺序

  5. 举例推导dp数组:
    word1:"sea",word2:"eat"为例,推导dp数组状态图如下:
    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][j - 1] + 1);
                }
            }
        }
        return dp[word1.size()][word2.size()];
    }
};
  • 时间复杂度: O ( n ∗ m ) O(n * m) O(nm)
  • 空间复杂度: O ( n ∗ m ) O(n * m) O(nm)

72. 编辑距离

文档讲解 : 代码随想录 - 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]) {
    	word1增加(插入); // 相当于word2删除
    	word1删除;
    	word1替换;
    	}
    
    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; 
        //从左到右分别是替换、删除、增加
    }
    
  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;
    所以C++代码如下:

    for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
    for (int j = 1; j <= word2.size(); j++) dp[0][j] = j; //dp[0][0]在上面已经处理过
    
  4. 确定遍历顺序
    从递推公式 dp[i][j] = min({dp[i - 1][j - 1], dp[i - 1][j], dp[i][j - 1]}) + 1;dp[i][j] = dp[i - 1][j - 1]可以看出dp[i][j]都是根据左上方、正上方、正左方推出来的。所以在dp矩阵中一定是从左到右从上到下去遍历。
    在这里插入图片描述

  5. 举例推导dp数组:
    以示例1为例,输入:word1 = "horse", word2 = "ros"为例,dp矩阵状态图如下:
    dp数组

本题代码:

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));
        for (int i = 0; i <= word1.size(); i++) dp[i][0] = i;
        for (int j = 1; 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[word1.size()][word2.size()];
    }
};
  • 时间复杂度: O ( n ∗ m ) O(n * m) O(nm)
  • 空间复杂度: O ( n ∗ m ) O(n * m) O(nm)

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

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

相关文章

肖特基二极管SBD,SOD-123封装有哪些型号?

肖特基二极管&#xff0c;常用二极管之一&#xff0c;对于电子工程师来说&#xff0c;并不陌生。肖特基二极管&#xff0c;又称肖特基势垒二极管、热载流子二极管&#xff0c;英文Schottky Barrier Diode&#xff0c;缩写SBD&#xff0c;是利用金属-半导体(M-S)接触特性制成&am…

C语言:扫雷小游戏

文接上一篇博文C语言&#xff1a;三子棋小游戏。本篇博文是使用C语言来实现扫雷小游戏的。这里不对扫雷的规则进行赘述。玩家通过键盘输入坐标来探雷。博主在实现扫雷之前从未看过扫雷实现的相关视频&#xff0c;所以这里实现的扫雷完全是博主的原生思路&#xff0c;具有逻辑性…

用python开发一个炸金花小游戏

众所周知&#xfeff;扑克牌可谓是居家旅行、桌面交友的必备道具&#xff0c; 今天我们用 Python 来实现一个类似炸金花的扑克牌小游戏&#xff0c;先来看一下基本的游戏规则。 炸&#xff08;诈&#xff09;金花又叫三张牌&#xff0c;是在全国广泛流传的一种民间多人纸牌游戏…

乐信仍面临资产质量下降和拖欠率上升风险

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 公司介绍 乐信(LX)成立于2013年10月&#xff0c;是中国领先的新消费数字科技服务商。旗下业务包括线上分期购物商城分期乐&#xff0c;全场景信用消费产品乐花卡&#xff0c;新型分期购物平台买吖&#xff0c;助力金融机构…

广告、政府、IT三重合作:凭爱校对轻松搞定文本质量

在广告创意、政府政策和IT开发这三个看似不相关的领域中&#xff0c;有一个共同的需求&#xff1a;高质量的文本内容。本文将探讨如何通过使用“爱校对”工具&#xff0c;在这三个行业内确保文本质量&#xff0c;从而提高工作效率和准确性。 广告行业&#xff1a;语境与创意的完…

EDM邮件营销:使用EDM代发实现更高发送率

虽然现在进入数字时代&#xff0c;但电子邮件依然是企业跟客户之间沟通最有效的方式之一。为了吸引并且留存目标用户&#xff0c;各大企业都在努力做好EDM&#xff08;Electronic Direct Mail&#xff09;邮件营销。但是通常用电子邮箱发送外贸邮件会有发送数量和自动化的限制&…

固定资产管理怎么写报告

撰写固定资产管理报告时&#xff0c;需要考虑以下几个维度的数据&#xff1a;  资产总量和分类&#xff1a;列出公司的固定资产总量、种类以及各类型资产的数量。  资产使用情况&#xff1a;统计各类型资产的使用率、闲置率、报废率等数据&#xff0c;以及不同部门的资产使…

西电Latex毕业模板使用时的小技巧

西电Latex毕业模板 配置的环境&#xff1a;textlivetextstudio \qqad 空格 参考文献先设置成bib&#xff0c;放到tex文件下&#xff0c;然后如下操作就可以将参考文献加载进去 如果搜不到相关文献的bib格式&#xff0c;可以用zotero软件将下载好的文件导出为bib格式&#xf…

43、Flink之Hive 读写及详细验证示例

Flink 系列文章 1、Flink 部署、概念介绍、source、transformation、sink使用示例、四大基石介绍和示例等系列综合文章链接 13、Flink 的table api与sql的基本概念、通用api介绍及入门示例 14、Flink 的table api与sql之数据类型: 内置数据类型以及它们的属性 15、Flink 的ta…

在线客服如何与客户进行有效沟通?

在今天的“互联网”时代&#xff0c;越来越多的服务都开始向线上转移&#xff0c;其中最受欢迎的莫过于在线客服。在线客服不仅可以提供7x24小时的在线咨询服务&#xff0c;还可以提高企业的服务效率和满意度。然而&#xff0c;有时候在线客服与客户之间的沟通效果却不太令人满…

EMERSON A6500-CC 机架接口模块 AMS参数

EMERSON A6500-CC 机架接口模块 AMS参数 ModBus和机架接口模块设计用于工厂的高可靠性 最关键的旋转机械。它从所有AMS A6500 ATG模块读取参数 并通过ModBus TCP/IP和/或ModBus RTU&#xff08;串行&#xff09;输出这些参数。 此外&#xff0c;OPC UA可用于向第三方系统传输数…

sentinel1.8.6中的blockHandler/blockHandlerClass和fallback/fallbackClass

官网介绍 简单的说blockHandler/blockHandlerClass是给限流降级用的&#xff0c;异常为BlockException&#xff0c;fallback/fallbackClass是给除BlockException之外的业务异常兜底用的。 官方文档还说明。1.6.0 之前的版本 fallback 函数只针对降级异常&#xff08;DegradeEx…

Leetcode125. 验证回文串

力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后&#xff0c;短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。 字母和数字都属于字母数字字符。 给你一个字符串 s&…

软件测试/测试开发丨Web自动化测试 关键数据记录

点此获取更多相关资料 本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接&#xff1a;https://ceshiren.com/t/topic/27105 记录关键数据的作用 内容作用日志1、记录代码执行情况&#xff0c;方便复现场景&#xff0c;也可以作为bug依据截图1、断言失败或成功的截图&#…

cesium开发入门(vue2)

一、cesium介绍 Cesium是国外一个基于JavaScript编写的使用WebGL的地图引擎。Cesium支持3D,2D,2.5D形式的地图展示&#xff0c;可以自行绘制图形&#xff0c;高亮区域&#xff0c;并提供良好的触摸支持&#xff0c;且支持绝大多数的浏览器和mobile。 中文文档 官网 二、创建…

transformer位置编码最详细的解析

位置编码positional encoding 1. 位置编码是什么&#xff0c;为什么需要它&#xff1f;2. transformer提出的位置编码方法3. 直觉4. 其他细节5. 相对位置6. 常见问题解答 1. 位置编码是什么&#xff0c;为什么需要它&#xff1f; 位置和词语的顺序是任何语言的重要组成部分。它…

韩老师java教程

基础知识 进制 进制首位表示方式二进制0B十进制无八进制0十六进制0X 进制转换 x进制转十进制 正常&#xff0c;没什么问题 十进制转x进制 将该数不断除以x&#xff0c;直到商为0为止&#xff0c;然后将每一步得到的余数倒过来&#xff0c;就是对应的x进制 二进制转八进…

MySQL——单行处理函数和多行处理函数

数据处理函数&#xff1a; 单行处理函数&#xff1a;一个输入对应一个输出 多行处理函数&#xff1a;多个输入对应一个输出 单行处理函数&#xff1a; 将大写转换为小写&#xff1a;lower(); select lower(ename) as ename from emp; 将小写转换为大写&#xff1a;upper(); se…

软件测试工作中需要使用的工具

作为一个测试人员在日常工作中会使用到很多的工具&#xff0c;今天给大家分享一下这些工具。对软件测试、接口、自动化、性能测试和日常文档编写办公有帮助的网站。 接口测试大力推荐国产的接口测试工具&#xff1a;apipost&#xff0c;apipost还是一款很不错的接口文档生产工…

本地PC机通过SSH方式远程Jetson

1. 检测电脑是否安装openSSH 以管理员身份运行powershell终端输入以下命令&#xff1a; Get-WindowsCapability -Online | ? Name -like OpenSSH*若没有安装OpenSSH&#xff0c;会出现如下图提示&#xff1a; 输入Add-WindowsCapability -Online -Name OpenSSH.Client~~~~0.…