当前位置: 首页 > news >正文

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

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

题目链接/文章讲解/视频讲解:代码随想录

1.代码展示

//583.两个字符串的删除操作
int minDistance(string word1, string word2) {//step1 构建dp数组,dp[i][j]的含义是要使以i-1为结尾的word1和以j-1为结尾的word2//删除其元素后相同所需最小的删除步数vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));//step2 状态转移方程//if (word1[i - 1] == word[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, dp[i - 1][j - 1] + 2);//对应着三种情况,删除word1[i - 1]或者word2[j - 1]或者同时删除//step3 初始化for (int i = 0; i <= word1.size(); i++) {dp[i][0] = i;}for (int j = 0; j <= word2.size(); j++) {dp[0][j] = j;}//step4 开始遍历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, dp[i - 1][j - 1] + 2 });}}}return dp[word1.size()][word2.size()];
}

2.本题小节

        思考: 首先明确dp[i][j]的含义是下标以i-1为结尾的word1和以下标为j-1结尾的word2删除元素相等所需的最少步骤。当word1[i - 1] == word2[j - 1]时,此时不需要删除元素,因此dp[i][j] = dp[i - 1][j - 1];当不相等时,此时既可以删除word1下标i-1处的元素,对应的是dp[i - 1][j] + 1,也可以删除word2下标j-1处的元素,对应的是dp[i][j-1] + 1,也可以是同时删除掉,对应的是dp[i - 1][j - 1] + 2,因此dp[i][j]从上面三种情况中选择最小的。初始化时要注意,dp[i][0]对应的位置初始化为i,dp[0][j]对应位置初始化为j,这个很好想。

        步骤:注意思考的内容,按照步骤来即可。

72. 编辑距离

 题目链接/文章讲解/视频讲解:代码随想录

1.代码展示

//72.编辑距离
int minDistance(string word1, string word2) {//step1 构建dp数组,dp[i][j]的含义是要使以i-1为结尾的word1和以j-1为结尾的word2//相同需要操作(增加、删减、替换)的次数vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));//step2 状态转移方程//if (word1[i - 1] == word[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, dp[i - 1][j - 1] + 1);//对应着三种情况,删掉word1[i - 1](删除),删掉word2[j - 1](增加),替换//step3 初始化for (int i = 0; i <= word1.size(); i++) {dp[i][0] = i;}for (int j = 0; j <= word2.size(); j++) {dp[0][j] = j;}//step4 开始遍历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, dp[i - 1][j - 1] + 1 });}}}return dp[word1.size()][word2.size()];
}

2.本题小节

        思考:dp[i][j]的含义是以下标i-1为结尾的word1通过增加,删除,替换能够变成以下标j-1为结尾的word2所需要的最小步骤。当word1[i - 1] == word2[j - 1]时,此时不需要操作,则dp[i][j] = dp[i - 1][j - 1];当不相等时,可以通过删除(删除word1[i - 1])、增加(删除word2[j - 1])、和替换(word1[i - 1]替换为word[j - 1])来操作,分别对应的时dp[i - 1][j] + 1、dp[i][j - 1] + 1、dp[i - 1][j - 1] + 1,选择最小情况,初始化和上题一样。

        基本步骤:根据思考和动态规划的步骤来即可。

编辑距离总结:代码随想录

http://www.lryc.cn/news/162079.html

相关文章:

  • hive解决了什么问题
  • Lumion 和 Enscape 应该选择怎样的笔记本电脑?
  • ICCV 2023 | MoCoDAD:一种基于人体骨架的运动条件扩散模型,实现高效视频异常检测
  • Mac电脑怎么使用NTFS磁盘管理器 NTFS磁盘详细使用教程
  • Java设计模式-结构性设计模式(代理设计模式)
  • 线性空间、子空间、基、基坐标、过渡矩阵
  • 【MySQL】CRUD (增删改查) 基础
  • Socks5代理IP:保障跨境电商的网络安全
  • macOS通过钥匙串访问找回WiFi密码
  • Debian11之稳定版本Jenkins安装
  • kakfa 3.5 kafka服务端处理消费者客户端拉取数据请求源码
  • 【Linux】进程概念I --操作系统概念与冯诺依曼体系结构
  • BRAM/URAM资源介绍
  • 分享一个基于python的个性推荐餐厅系统源码 餐厅管理系统代码
  • Mysql5.7开启SSL认证且支持Springboot客户端验证
  • 微信小程序的页面滚动事件监听
  • 数据可视化:四大发明的现代转化引擎
  • HarmonyOS实现几种常见图片点击效果
  • 3D视觉测量:计算两个平面之间的夹角(附源码)
  • deepin V23通过flathub安装steam畅玩游戏
  • C语言是否快被时代所淘汰?
  • 简化转换器:使用您理解的单词进行最先进的 NLP — 第 1 部分 — 输入
  • C++多线程编程(第三章 案例2,条件变量,生产者-消费者模型)
  • Go语言使用AES加密解密
  • MAC ITEM 解决cd: string not in pwd的问题
  • 解决跨域的几种方式
  • 单片机-LED介绍
  • ERROR:GLOBAL_INITIALISERS: do not initialise globals to 0
  • 高德地图,绘制矢量图形并获取经纬度
  • 【100天精通Python】Day59:Python 数据分析_Pandas高级功能-多层索引创建访问切片和重塑操作,pandas自定义函数和映射功能