算法学习day56

news2025/2/25 19:17:53

算法学习day56

  • 1.力扣583. 两个字符串的删除操作
    • 1.1 题目描述
    • 1.2分析
    • 1.3 代码
  • 2.力扣72. 编辑距离
    • 2.1 题目描述
    • 2.2 分析
    • 2.3 代码
  • 3.参考资料

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

1.1 题目描述

题目描述:

给定两个单词word1和word2,找到使得word1和word2相同所需要的的最小步数,每步可以删除任意一个字符串的一个字符。

例:

输入:“sea”,“eat”

输出:2

解释:第一步将"sea"变为"ea",第二步将“eat”变成“ea”

1.2分析

1.确定dp数组以及下标含义

dp[i] [j] :以i-1为结尾的字符串word1和以j-1位结尾的字符串word2,想要达到相同,所需要删除元素的最少次数。

2.确定递推公式

(1)当word1[i-1]与word2[j-1]相同的时候

dp[i] [j] = dp[i - 1] dp[j-1]

(2)当word1[i-1]与word2[j-1]不相同的时候

​ (2.1)删word1[i-1],最少操作次数为dp[i-1] [j] + 1

​ (2.2)删word2[j-1],最少操作次数为dp[i] [j-1] +1

​ (2.3)同时删除word1[i-1]和word2[j-1],操作的最少次数为dp[i-1] [j-1]+2

取最小值,得递推公式:dp[i] [j] = min(min(dp[i-1] [j-1]+2,dp[i-1] [j]+1), dp[i] [j-1] + 1)

3.dp数组如何初始化

dp[i] [0]:word2为空字符串,以i-1为结尾的字符串word1需要删除多少个元素,才能和word2相同?显然dp[i] [0] = i

dp[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.确定遍历顺序

从上到下,从左到右。

5.举例推导dp数组
在这里插入图片描述

1.3 代码

class Solution {
public:
    int minDistance(string word1, string word2) {
        // 创建动态规划数组,行数为 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;  // 当 word2 为空时,将 word1 中的所有字符都删除,需要的操作数为 i
        for (int j = 0; j <= word2.size(); j++) dp[0][j] = j;  // 当 word1 为空时,将 word2 中的所有字符都插入到 word1 中,需要的操作数为 j
        
        // 递推计算 dp 数组中的其他元素
        for (int i = 1; i <= word1.size(); i++) {
            for (int j = 1; j <= word2.size(); j++) {
                if (word1[i - 1] == word2[j - 1]) {
                    // 如果 word1 的第 i 个字符和 word2 的第 j 个字符相同,那么将不需要进行操作
                    dp[i][j] = dp[i - 1][j - 1];
                } else {
                    // 当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] = min(min(dp[i-1][j-1]+2,dp[i-1][j]+1), dp[i][j-1] + 1);
                }
            }
        }
        
        // 返回 dp 数组的最后一个元素,即将 word1 转换为 word2 需要的最少操作数
        return dp[word1.size()][word2.size()];
    }
};

2.力扣72. 编辑距离

2.1 题目描述

题目描述:

给你两个单词word1和word2,请你计算出word1转换成word2所需要的最小操作数。

例1:

输入:word1 = “horse”, word2 = “ros”

输出:3

解释:horse -> rorse (将 ‘h’ 替换为 ‘r’) rorse -> rose (删除 ‘r’) rose -> ros (删除 ‘e’)

例2:

输入:word1 = “intention”, word2 = “execution”

输出:5

解释: intention -> inention (删除 ‘t’) inention -> enention (将 ‘i’ 替换为 ‘e’) enention -> exention (将 ‘n’ 替换为 ‘x’) exention -> exection (将 ‘n’ 替换为 ‘c’) exection -> execution (插入 ‘u’)

2.2 分析

1.确定dp数组以及下标的含义

dp[i] [j]表示以下标i-1为结尾的字符串word1和以下标j-1为结尾的字符串word2,最近的编辑距离为dp[i] [j].

2.确定递推公式

if(word1[i-1] == word23[j-1])
    不操作
if(word1[i-1] !=word2[j-1])
    增
    删
    换

如上所视,一共四种情况:

if(word1[i-1] == word23[j-1])说明不需要任何操作,递推公式:dp[i] [j] = dp[i-1] [j-1]

if(word1[i-1] !=word2[j-1]):

(1) word1删除一个元素,那么就是以下标i-2为结尾的word1与j-1为结尾的word2的最近编辑距离再加上一个操作。

dp[i] [j] = dp[i-1] [j] + 1

(2)word2删除一个元素,那么就是以下标i-1为结尾的word1与j-2为结尾的word2的最近编辑距离在加上一个操作。

dp[i] [j] =dp[i] [j-1] + 1

(3)替换元素,word1替换word1[i-1],使其与word2[j-1]相同。

dp[i] [j] =dp[i-1] [j-1] +1

综上取最小得递推公式:dp[i] [j] = min(min(dp[i-1] [j-1],dp[i-1] [j]),dp[i] [j-1]) + 1;

3.dp数组如何初始化

dp[i] [j]:表示以下标i-1为结尾的字符串word1和以下标j-1为结尾的字符串成word2,最近的编辑距离为dp[i] [j].

dp[i] [0]:以下标i-1为结尾的字符串word1和空字符串word2,最近编辑距离为dp[i] [0].

dp[i] [0]表示对word1里的元素全部做删除操作,dp[i] [0] = i;

同理:

dp[0] [j] = j;

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.确定遍历顺序

从上到下,从左到右。

5.举例推导dp数组

在这里插入图片描述

2.3 代码

class Solution {
public:
    int minDistance(string word1, string word2) {
        // 创建一个二维数组来存储最小编辑距离
        // dp[i][j]表示将word1的前i个字符转换成word2的前j个字符所需的最小编辑距离
        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 = 0; j <= word2.size(); j++) dp[0][j] = j;
        
        // 计算dp数组中的其他值
        for (int i = 1; i <= word1.size(); i++) {
            for (int j = 1; j <= word2.size(); j++) {
                // 如果word1的第i个字符等于word2的第j个字符
                // 则不需要进行任何操作,编辑距离等于dp[i-1][j-1]
                if (word1[i - 1] == word2[j - 1]) {
                    dp[i][j] = dp[i - 1][j - 1];
                }
                // 如果word1的第i个字符不等于word2的第j个字符
                // 则有三种操作:插入、删除、替换
                // 插入:dp[i][j-1]表示将word1的前i个字符转换成word2的前j-1个字符的最小编辑距离
                // 删除:dp[i-1][j]表示将word1的前i-1个字符转换成word2的前j个字符的最小编辑距离
                // 替换:dp[i-1][j-1]表示将word1的前i-1个字符转换成word2的前j-1个字符的最小编辑距离
                // 由于需要对word1进行操作,因此操作数需要加1
                else {
                    dp[i][j] = min(min(dp[i-1][j-1],dp[i-1][j]),dp[i][j-1]) + 1;
                }
            }
        }
        // 返回将word1的所有字符转换成word2的所有字符所需的最小编辑距离
        return dp[word1.size()][word2.size()];
    }
};

3.参考资料

[代码随想录]

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

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

相关文章

探索数据结构之精髓:单链表解密

文章目录1. 前言2. 单链表的特点3. 单链表的基础操作&#x1f351; 接口总览&#x1f351; 初始化操作&#x1f351; 插入操作&#x1f345; 优化操作&#x1f351; 删除操作&#x1f345; 优化操作&#x1f351; 获取元素&#x1f345; 按置查找&#x1f345; 按值查找&#x…

从C出发 20 --- 函数参数深度剖析

我们在编写这个函数的时候参数 n 的值具体是多少&#xff1f; 在编写一个函数的时候参数值是没法确定的&#xff0c;所以将 (int n) 这个参数命名为形参 那么这个参数的值什么时候指定&#xff0c;具体函数调用的时候指定 比如 在main 里面调用 实参用来初始化形参 初始化之…

安装多个版本的Node.js的方法

要在同一台计算机上安装多个版本的Node.js&#xff0c;可以使用以下几种方法&#xff1a; 使用nvm&#xff08;Node Version Manager&#xff09;&#xff1a;nvm是一个用于管理多个Active Node.js版本的工具。您可以使用nvm轻松地在系统中安装、卸载和切换不同版本的Node.js。…

Leetcode每日一题——“消失的数字”

各位CSDN的uu们你们好呀&#xff0c;今天&#xff0c;小雅兰又开新专栏了&#xff0c;以后会在Leetcode上面进行刷题&#xff0c;尽量每天写一道&#xff0c;请大家监督我&#xff01;&#xff01;&#xff01;好啦&#xff0c;让我们进入Leetcode的世界吧 力扣 对于这道题目&a…

南卡OE Pro上线!开放式耳机新里程碑!前所未有的音质舒适双冠

当前耳机市场放眼望去几乎都是TWS的天下&#xff0c;但是大多数的蓝牙耳机都存在着以下痛点&#xff1a;长时间佩戴涨耳、出现听诊器效应、耳朵内部发痒以及与外界声音隔开缺乏安全性等等问题。 为此&#xff0c;国内智能声学品牌厂商NANK南卡针对用户的特点&#xff0c;于近日…

中小企业如何实施知识管理策略?

随着信息化建设的深入&#xff0c;IT不仅成为企业运营的基础平台&#xff0c;而且在ERP、CRM、OA等信息系统内沉淀了大量的知识&#xff0c;成为企业创新的源泉&#xff0c;大中企业信息化建设中知识管理越来越重要。 应该如何实现知识管理呢&#xff1f; 知识管理本身就属于企…

Flutter系列(七)ListView 图文列表详解

完整工程&#xff1a; Flutter系列&#xff08;四&#xff09;底部导航顶部导航图文列表完整代码_摸金青年v的博客-CSDN博客 详细解读: Flutter系列&#xff08;五&#xff09;底部导航详解_摸金青年v的博客-CSDN博客 Flutter系列&#xff08;六&#xff09;顶部导航详解_摸金青…

初学SSM时做的-IKUN图书管理系统

项目介绍 项目工具:IntelliJ IDEA 2021.2.2 图书后台管理系统&#xff0c;采用SpringBootMybatiusThymeleaf&#xff0c;页面使用Element框架&#xff0c;使用RESTful API风格编写接口。 数据库使用mysql 已实现功能 基本增删改查,联表查询 拦截器登录验证 项目技术栈 Spr…

4.15--设计模式之创建型之责任链模式(总复习版本)---脚踏实地,一步一个脚印

一、什么是责任链模式&#xff1a; 责任链模式属于行为型模式&#xff0c;是为请求创建了一个接收者对象的链&#xff0c;将链中每一个节点看作是一个对象&#xff0c;每个节点处理的请求均不同&#xff0c;且内部自动维护一个下一节点对象。 当一个请求从链式的首端发出时&a…

C++(Qt)软件调试---qmake编译优化和生成调试信息(9)

C(Qt)软件调试—qmake编译优化和生成调试信息&#xff08;9&#xff09; 文章目录C(Qt)软件调试---qmake编译优化和生成调试信息&#xff08;9&#xff09;1、前言1.1 编译器优化是什么1.2 调试信息是什么1.3 测试环境2、Qt编译模式说明3、比较Linux下Qt三种编译模式1.1 编译生…

DevOps系列文章 - K8S知识体系

环境搭建部分&#xff1a; 1、安装前的准备工作 # 关闭防火墙 systemctl stop firewalld systemctl disable firewalld# 查看hostname并修改hostname # 查看本机hostname hostnamectl set-hostname k8s-master # 把本机名设置成k8s-master hostnamectl status # 查看修改结…

Linux复习 / 文件系统QA梳理

文章目录前言Q&A文件的基本理解Q&#xff1a;谈谈你是怎么理解文件的&#xff1f;Q&#xff1a;什么是当前工作路径&#xff1f;Q&#xff1a;文件与操作系统有着怎样的关系&#xff1f;Q&#xff1a;为什么语言要封装系统接口&#xff1f;文件描述符Q&#xff1a;系统和进…

基于JSP的网上购物系统的设计与实现(论文+源码)_kaic

摘 要 近些年来&#xff0c;社会的生产力和科技水平在不断提高&#xff0c;互联网技术也在不断更新升级&#xff0c;网络在人们的日常生活中扮演着一个重要角色&#xff0c;它极大地方便了人们的生活。为了让人们实现不用出门就能逛街购物&#xff0c;网络购物逐渐兴起慢慢变得…

ES6(声名、解构)

参考文档&#xff1a; ES6 入门教程https://es6.ruanyifeng.com/ 注意&#xff1a;内容较多&#xff1a;只看引用部分的内容即可&#xff08;代码一眼过搭配理解&#xff09; 一、变量声明 1. let let声名的变量只在所处于的块级有效 let a 10; if (true) {let b 20;cons…

人工智能 AI 绘画发展史

到了去年4月, 著名人工智能团队OpenAI 也发布了新模型 DALLE 2代&#xff0c;该名称来源于著名画家达利&#xff08;Dal&#xff09;和机器人总动员&#xff08;Wall-E&#xff09;, 同样支持从文本描述生成效果良好的图像. 而很多读者对AI绘画开始产生特别的关注, 或许是从以下…

有趣的Hack-A-Sat黑掉卫星挑战赛——AES加密通信链路侧信道攻击leaky

国家太空安全是国家安全在空间领域的表现。随着太空技术在政治、经济、军事、文化等各个领域的应用不断增加&#xff0c;太空已经成为国家赖以生存与发展的命脉之一&#xff0c;凝聚着巨大的国家利益&#xff0c;太空安全的重要性日益凸显[1]。而在信息化时代&#xff0c;太空安…

如何将Springboot项目通过IDEA打包成jar包,并且转换成可执行文件

首先在IDEA打开你的项目&#xff0c;需要确认项目可以正常运行&#xff0c;然后点击页面右侧的Maven,运行Lifecycle下的package, 此时在项目的target目录下就可以看到一个jar包 这个时候你可以在jar包所在目录下执行cmd窗口&#xff0c;运行 java -jar campus-market-0.0.1-S…

BUUCTF-SimpleRev

下载文件 查壳 没有加壳 并且是64 放入ida64 SHIFTF12 访问字符串 得到关键字符串 双击 然后 CRTLX 查找交互 F5 反编译 得到了代码 开始代码审计 我们可以发现有两个十六进制的东西 r 对其转换为字符串 srcSLCDN v9wodah 然后继续往下看 发现textjoin函数 我们进入看…

STM32+AT24C02实现易变参数存储

AT24C02是一个2K位串行CMOS E2PROM&#xff0c; 内部含有256个8位字节存储单元&#xff0c;该器件通过IIC总线接口进行操作&#xff0c; AT24C02把存储空间分为 32 页&#xff0c;每页可存储8个字节的数据&#xff0c;具有硬件数据写保护功能&#xff0c;100万次擦写&#xff0…

Docker理论总结

目录 容器技术的演变 物理机时代 虚拟化时代 容器化时代 容器化技术的应用场景 Docker介绍与基本概念 标准化的应用打包 Docker的发展 Docker是容器化平台 Docker体系架构 容器与镜像 Docker执行流程 容器内部 Tomcat容器内部结构 在容器中执行命令 容器生命周…