【Day59】代码随想录之动态规划_583两个字符串的删除操作_72编辑距离

文章目录

      • 动态规划理论基础
        • 动规五部曲:
        • 出现结果不正确:
      • 1. 583两个字符串的删除操作
      • 2. 72编辑距离

动态规划理论基础

动规五部曲:
  1. 确定dp数组 下标及dp[i] 的含义。
  2. 递推公式:比如斐波那契数列 dp[i] = dp[i-1] + dp[i-2]。
  3. 初始化dp数组。
  4. 确定遍历顺序:从前到后or其他。
  5. 打印。
出现结果不正确:
  1. 打印dp日志和自己想的一样:递推公式、初始化或者遍历顺序出错。
  2. 打印dp日志和自己想的不一样:代码实现细节出现问题。

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

参考文档:代码随想录

分析:
题目想要word1和word2最终相同更改word1和word2的最小步数。我的思路是找出word1和word2的最长子串长度target,分别用word1的长度减去target加上word2的长度减去target。当if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = max(dp[i][j-1], dp[i-1][j]); 相等两者子串长度的最大值在以i-2结尾和j-2结尾的基础上+1,不相等则取i-1和j-2与i-2和j-1最长子串的最大值。

在这里插入图片描述

dp五部曲:

  1. dp[i][j]含义:word1以i-1结尾和word2以j-1结尾的子串最大长度。
  2. 递推公式:if(word1[i-1] == word2[j-1]) dp[i][j] = dp[i-1][j-1] + 1; else dp[i][j] = max(dp[i][j-1], dp[i-1][j]);
  3. 初始化:dp[i][0] = 0; dp[0][j] = 0;
  4. 遍历顺序:从word1到word2和从word2到word1都可以。

代码:

class Solution {
public:int minDistance(string word1, string word2) {//要使得两个相同,获取最大子串//word1和word2减去最长子串即可vector<vector<int>> dp(word1.size() + 1, vector<int>(word2.size() + 1, 0));int target = 0;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] + 1;if(dp[i][j] > target) target = dp[i][j];}else dp[i][j] = max(dp[i-1][j], dp[i][j-1]);}}int sum = word1.size() - target;sum += word2.size() - target;return sum;}
};

2. 72编辑距离

参考文档:代码随想录

分析:
刚看到题目的时候想到找字符串word1和字符串word2的最长子串,之后删除再替换,但是这不是最小的步数。在对字符串的操作中,到底替换、删除、添加出现在什么时候呢?当word1和word2中的字符不相等的时候考虑这三个操作。进而递推公式dp[i][j] = min(dp[i-1][j-1], min(dp[i-1][j], dp[i][j-1])) + 1;三个操作中的最小的步数。

dp五部曲:

  1. dp[i][j]含义:word1中以i-1结尾的字符串满足符合word2中以j-1结尾的字符串需要的最小步数。
  2. 递推公式: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], min(dp[i-1][j], dp[i][j-1])) + 1;
  3. 初始化:dp[i][0]表示word1以i-1结尾,word2为空串,两个一致的最小步数,dp[i][0] = i; dp[0][j]表示word1为空串,word2以j-1结尾,word1满足word2的最小步数,dp[0][j] = j。
  4. 遍历顺序:从word1到word2与从word2到word1都可以。

代码:

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;//更新dpfor(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], min(dp[i-1][j], dp[i][j-1])) + 1;}}}return dp[word1.size()][word2.size()];}
};

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI新工具(20240228) EMO - 阿里巴巴的表情驱动的音频到视频转换框架;DepthFlow;Globe Explorer等

EMO - 阿里巴巴的表情驱动的音频到视频转换框架 EMO&#xff08;Emote Portrait Alive&#xff09;是一个先进的表情驱动的音频到视频转换框架&#xff0c;可以通过音频&#xff08;比如说话或唱歌的声音&#xff09;和一张单独的参考图片&#xff0c;生成带有丰富面部表情和头…

VPX基于全国产飞腾FT-2000+/64核+复旦微FPGA的计算刀片

6U VPX计算板 产品简介 产品特点 飞腾计算平台&#xff0c;国产化率100% VPX-MPU6902是一款基于飞腾FT-2000/64核的计算刀片&#xff0c;主频2.2GHz&#xff0c;负责业务数据流的管控和调度。搭配自带独立显示芯片的飞腾X100芯片&#xff0c;可用于于各类终端及服务器类应用场…

SpringBoot 自定义注解实现操作日志记录

文章目录 前言正文一、项目结构介绍二、核心类2.1 核心注解2.1.1 CLog 日志注解2.1.2 ProcessorBean 处理器bean 2.2 切面类2.3 自定义线程池2.4 工具类2.4.1 管理者工具类 2.5 测试2.5.1 订单创建处理器2.5.2 订单管理者2.5.3 订单控制器2.5.4 测试报文2.5.5 测试结果 附录1、…

Linux学习之system V

目录 一&#xff0c;system V共享内存 快速认识接口 shmget(shared memory get) shmat(shared memory attach) shmdt(shared memory delete) shmctl (shared memory control) 编写代码 综上那么共享内存与管道通信有什么区别&#xff1f; system v消息队列 system v信号…

运维管理制度优化:确保IT系统稳定运行的关键策略

1、总则 第一条&#xff1a;为保障公司信息系统软硬件设备的良好运行&#xff0c;使员工的运维工作制度化、流程化、规范化&#xff0c;特制订本制度。 第二条&#xff1a;运维工作总体目标&#xff1a;立足根本促发展&#xff0c;开拓运维新局面。在企业发展壮大时期&#x…

助你打通SwiftUI任督二脉

序言 开年的第一篇文章&#xff0c;今天分享的是SwiftUI&#xff0c;SwiftUI出来好几年&#xff0c;之前一直没学习&#xff0c;所以现在才开始&#xff1b;如果大家还留在 ​​iOS​​ 开发&#xff0c;这们语言也是一个趋势&#xff1b; 目前待业中.... 不得不说已逝的2023年…

多个版本的Python如何不冲突?

转载文章&#xff0c;防止忘记或删除 转载于&#xff1a;电脑中存在多个版本的Python如何不冲突&#xff1f; - 知乎 (zhihu.com) 如何安装多版本的Python并与之共存&#xff1f; 如果你的工作涉及到Python多版本之间开发或测试&#xff0c;那么请收藏本文&#xff0c; 如果你…

从Spring Boot应用上下文获取Bean定义及理解其来源

前言 在Spring框架中&#xff0c;Bean是组成应用程序的核心单元。特别是在Spring Boot项目中&#xff0c;通过使用SpringApplication.run()方法启动应用后&#xff0c;我们可以获得一个ConfigurableApplicationContext实例&#xff0c;这个实例代表了整个应用程序的运行时环境…

开源世界的学术问题

自由软件基金会是1983年成立的&#xff0c;到现在是41年。正好很有意思的是&#xff0c;在去年还有一篇文章&#xff08;CSDN 的翻译&#xff09;&#xff0c;专门在质疑说成立 40 年的自由软件基金会是不是已经快不行了&#xff0c;所以我们会用这个标题叫做兴衰发展历程来介绍…

2024!深入了解 大语言模型(LLM)微调方法(总结)

来源: AINLPer公众号&#xff08;每日干货分享&#xff01;&#xff01;&#xff09; 编辑: ShuYini 校稿: ShuYini 时间: 2024-2-28 引言 众所周知&#xff0c;大语言模型(LLM)正在飞速发展&#xff0c;各行业都有了自己的大模型。其中&#xff0c;大模型微调技术在此过程中起…

[vue2] 使用provide和inject时,无法获取到实时更新的数据

一、场景 当vue文件中存在多级的父子组件传值&#xff08;即&#xff1a;祖先向下传递数据&#xff09;、多个子组件或孙子级组件都要使用顶级或父级的数据时&#xff0c;使用provide 和 inject 组合无疑是很方便的一种做法了&#xff0c;但如此只是注入的初始值&#xff0c;并…

如何使用便签快速分类工作待办事项

在日常工作和生活中&#xff0c;我们经常需要处理各种各样的待办事项。而有效地分类这些任务&#xff0c;可以帮助我们更好地管理时间和提高工作效率。使用便签是一种简单而实用的方法&#xff0c;下面将介绍如何利用好用便签来快速分类工作待办事项。 首先&#xff0c;你可以…