【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.mzph.cn/news/707243.shtml

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

相关文章

选择排序的简单介绍

选择排序是一种简单直观的排序算法&#xff0c;其原理如下&#xff1a; 1. 遍历数组&#xff0c;找到最小&#xff08;或最大&#xff09;的元素&#xff0c;并将其与数组的第一个元素交换位置。 2. 接着在剩下的元素中找到最小&#xff08;或最大&#xff09;的元素&#xff…

Uniapp在IOS系统打包测试流程

大家好我是咕噜美乐蒂&#xff0c;很高兴又和大家见面了&#xff01;UniApp 是一种基于 Vue.js 的跨平台应用开发框架&#xff0c;可以用于快速构建同时支持多个平台&#xff08;包括iOS、Android、Web 等&#xff09;的应用程序。在 iOS 系统上打包和测试 UniApp 应用的流程可…

园区水费收费管理系统

园区水费收费管理系统是专为园区或小区的水费管理而设计的系统&#xff0c;旨在提高水费收费效率、精准监测水费使用情况&#xff0c;简化管理流程&#xff0c;为园区管理方和居民提供便捷、高效的水费管理解决方案。该系统结合了数字化技术和智能化管理手段&#xff0c;通过线…

『NLP学习笔记』图解 GPT-2(可视化 Transformer 语言模型)

图解 GPT-2(可视化 Transformer 语言模型) 文章目录 一. GPT-2和语言模型1.1. 什么是语言模型1.2 Transformer的语言模型1.3 和BERT的不同1.4 Transformer 组件的演变1.4.1 encoder组件1.4.2 decoder组件1.4.3 只有decoder组件的decoder模块1.5 GPT-2内部结构1.6 GPT-2内部结构…

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G python解法

P1090 [NOIP2004 提高组] 合并果子 / [USACO06NOV] Fence Repair G - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) nint(input()) arrlist(map(int,input().split())) arr.sort() sumarr[0] total_sum0 #一开始以为单纯排列就行了&#xff0c;然后将之前累计的时间求和 for i…

非同质化权益(NFR):重塑当代商业市场的新范式

每天五分钟讲解一个互联网知识&#xff0c;大家好我是啊浩说互联网 随着区块链技术的日益成熟和数字资产的普及&#xff0c;非同质化权益&#xff08;Non-Fungible Rights&#xff0c;简称NFR&#xff09;开始崭露头角&#xff0c;并在当代商业市场中引发了一场深刻的变革。NFR…

pg_rman部署及使用

PG_RMAN部署及使用 PGSQL推出开源备份工具pg_rman&#xff0c;类似于oracle的rman备份策略&#xff0c;实现了全量、增量和归档等多重备份方式&#xff0c;可以很灵活的管理PGSQL数据库的备份&#xff0c;支持在线和基于PITR的备份恢复方式。 1、使用postgres用户部署 [post…

动态规划-状态转移(O(n))

获取生成数组中的最大值 1.题目 2.思路 其实只要看透该题的本质 并不难&#xff0c;应用动态规划&#xff0c;题目就已经给出了状态方程的式子。 首先规定好maxn的大小&#xff0c;防止溢出。定义nums数组。定义一个函数&#xff0c;写入状态方程式子。最后定义一个变量与数…

【数据结构】数组

第一章、为什么数组的下标一般从0开始编号 提到数组&#xff0c;读者肯定不陌生&#xff0c;甚至还会很自信地说&#xff0c;数组很简单。编程语言中一般会有数组这种数据类型。不过&#xff0c;它不仅是编程语言中的一种数据类型&#xff0c;还是基础的数据结构。尽管数组看起…

Openstack云计算架构及前期服务搭建

openstack介绍 Openstack是一个开源的云计算管理平台项目&#xff0c;由几个主要的组件组合起来完成具体工作&#xff0c;支持几乎所有的云环境&#xff0c;项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台 ----百度百科 Openstack是一个云操作系统&a…

STM32开发(屏幕驱动ST7735S-SPI方式)用RT-Thread驱动测试

前言 使用ST7735S屏幕驱动&#xff0c;方便学习LVGL通过结构体的方式来管理相关函数和变量通讯协议和硬件驱动层进行解耦 驱动 配置&#xff08;用于对接硬件&#xff09; st7735s_conf.h // // Created by shchl on 2024/2/28. //#ifndef STM32F407V4T6_RTOS_ST7735S_CON…

css常用的选择器介绍

CSS&#xff08;层叠样式表&#xff09;选择器是CSS规则的一部分&#xff0c;它用于选择和定位网页上的元素&#xff0c;以便将样式应用到这些元素上。CSS选择器的种类繁多&#xff0c;每种选择器都有其特定的用途、特点和效率。在这篇文章中&#xff0c;我们将讨论一些常用的C…

Spring Boot项目如何快速从零开始打造一个属于自己的RPC框架

一、前言 在平时Spring Boot项目开发过程中,我们进行远程服务调用大都采用@RestController + @RequestMapping相关注解发布接口,使用OpenFeign组件进行微服务之间调用。这套技术架构已经足够完善了,当然没有什么问题,但是作为一个开发者,老是用一套框架天天写代码,不免有…

环境分析检测小剂量移液用耐受硝酸盐酸PFA材质吸管特氟龙移液枪枪头

PFA枪头&#xff0c;为移液枪专业定制&#xff0c;广泛用于ICP-MS、ICP-OES等痕量分析以及同位素分析等实验室。地质、电子化学品、半导体分析测试、疾控中心、制药厂、环境检测中心等一些机构少量移液用。 规格参考:0.1-0.2ml、1ml、2ml、5ml、10ml等。 目前部分规格可适配普…

什么是智能运维产品线和服务线

智能运维产品线和服务线涵盖了一系列自动化和智能化的技术和服务&#xff0c;旨在提升IT运维的效率和有效性。智能运维&#xff08;AIOps&#xff09;利用大数据、分析技术和机器学习能力来自动执行和简化运营工作流程&#xff0c;包括收集和汇总多源IT基础架构组件的数据、应用…

ARTS Week 18

Algorithm 本周的算法题为 485. 最大连续 1 的个数 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 示例 1&#xff1a;输入&#xff1a;nums [1,1,0,1,1,1]输出&#xff1a;3解释&#xff1a;开头的两位和最后的三位都是连续 1 &#xff0c;所以最大连续…

el-checkbox实现全选,反选,单选

<template><div class"box"><el-checkbox v-model"checkAll" :indeterminate"isIndeterminate" change"onAllSelectChange"> 全选</el-checkbox><div class"item" v-for"(item,index) in l…

R语言——条形图数据可视化的多种方式

本文章将会介绍如何使用R语言中的ggplot2包使用条形图进行数据可视化。将会使用一个“生产企业原材料的订购与运输”的订单数据&#xff0c;该数据来自2021数学建模国赛C题。 某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料总体可分为 A B C 三种类…

【C++那些事儿】深入理解C++类与对象:从概念到实践(上)| 揭开this指针的神秘面纱

&#x1f4f7; 江池俊&#xff1a; 个人主页 &#x1f525;个人专栏&#xff1a; ✅数据结构冒险记 ✅C那些事儿 &#x1f305; 有航道的人&#xff0c;再渺小也不会迷途。 文章目录 1. 面向过程和面向对象初步认识2.类的引入3.类的定义4.类的访问限定符及封装4.1 访问限定符…

使用 Python 和CE进行游戏修改

你好。在这篇文章中,我将向您展示如何通过使用作弊引擎编辑内存来破解游戏,并且还将用 python 编写一个程序,该程序将自动编辑内存并为我们进行破解。当我学习游戏黑客时,我注意到关于使用 python 进行游戏黑客的资源很少,而关于 c++ 的资源更多。但我是 python 的忠实粉丝…