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

news2024/11/23 23:50:01

583. 两个字符串的删除操作(中等)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路

这道题的状态定义和 1143. 最长公共子序列 相同,「定义一个 dp 数组,其中 dp[i]表示到位置 i 为止的子序列性质,并不是必须以 i 结尾」,此时 dp 数组的最后一位即为题目所求,不需要对每个位置进行统计。

状态定义

dp[i][j] 表示到 字符串word1 的第 i 个字符为止、word2 的第 j 个字符为止,使得两个字符串相等的最小删除次数。

状态转移方程

对于本道题,遍历两个字符串的所有位置,当 i>0 且 j>0 时,考虑两种情况:

  • 如果遍历到的字符相同,说明这两个字符匹配,无需进行任何操作,那么此时的最小删除次数不变,即 dp[i][j] = dp[i-1][j-1]
  • 如果遍历到的字符不同,那么肯定需要删除其中一个字符,既可以删除 word1[i],也可以删除 word2[j],所以此时的最小删除次数在原有删除次数上 +1, 即 dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1

初始化

由于在进行状态转移时,我们会用到 i-1 和 j-1 ,需要保证数组不越界,因此对边界情况进行分析:

  • 当 i = 0 且 j = 0 时,如果 word2[0] == word1[i] ,说明不需要删除,所以 dp[0][0] = 0,否则两个字符都需要删除,dp[0][0] = 2
  • 当 i = 1 ~ m-1 时,固定 j = 0,即 word2 只有一个字符,如果 word1[i] == word2[0] ,说明两个字符串能够匹配,此时需要删除 word1 的其他字符,即 dp[i][0] = i
  • 同理,当 j = 1 ~ n-1 时,固定 i = 0,即 word1 只有一个字符,如果 word1[0] == word2[j] ,说明两个字符串能够匹配,此时需要删除 word2 的其他字符,即 dp[0][j] = j

最终的返回结果

显然,最终返回 dp[m-1][n-1] ,这表示到字符串word1 的第 m-1 个字符为止、word2 的第 n-1 个字符为止,使得两个字符串相等的最小删除次数。

代码

class Solution {
public:
    int minDistance(string word1, string word2) {
        int m = word1.size(), n = word2.size();
        vector<vector<int>> dp(m, vector<int>(n));
        dp[0][0] = word1[0] == word2[0] ? 0 : 2;
        for(int i=1; i<m; ++i){
            if(word2[0] == word1[i]){
                dp[i][0] = i; 
            }else{
                dp[i][0] = dp[i-1][0] + 1; 
            }
        }
        for(int j=1; j<n; ++j){
            if(word1[0] == word2[j]){
                dp[0][j] = j; 
            }else{
                dp[0][j] = dp[0][j-1] + 1; 
            }
        }        
        for(int i=1; i<m; ++i){
            for(int j=1; j<n; ++j){
                if(word1[i] == word2[j]){
                    dp[i][j] = dp[i-1][j-1];
                }else{
                    dp[i][j] = min(dp[i-1][j], dp[i][j-1]) + 1;
                }
            }
        } 
        return dp[m-1][n-1];
    }
};

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

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

相关文章

富士康终于醒悟了,重新加码中国制造,印度制造信不过

4月25日富士康在郑州揭牌新事业总部&#xff0c;显示出在扰攘了数年之后&#xff0c;富士康再度加强郑州富士康的发展力度&#xff0c;这应该是富士康在印度努力数年之后终于清醒了&#xff0c;印度制造终究不如中国制造可靠。 一、苹果和富士康在印度发展的教训 这两年苹果和富…

智能算法系列之基于粒子群优化的模拟退火算法

文章目录 前言1. 算法结合思路2. 问题场景2.1 Sphere2.2 Himmelblau2.3 Ackley2.4 函数可视化 3. 算法实现代码仓库&#xff1a;IALib[GitHub] 前言 本篇是智能算法(Python复现)专栏的第四篇文章&#xff0c;主要介绍粒子群优化算法与模拟退火算法的结合&#xff0c;以弥补各自…

【unity项目实战】3DRPG游戏开发07——其他详细的设计

敌人动画设计 新增图层动画,把权重设为1 在新图层默认新建一个空状态Base State,实现怪物默认动画播放Base State,因为Base State是空动画,所以默认会找上一个层的动画,这样就实现了两个图层动画的切换,也可以选择修改权重的方式实现 敌人随机巡逻 显示敌人巡逻的范…

网络字节序和主机字节序详解(附代码)

一、网络字节序和主机字节序 网络字节序和主机字节序是计算机网络中常用的两种数据存储格式。 主机字节序&#xff1a; 指的是在计算机内部存储数据时采用的字节排序方式。对于一个长为4个字节的整数&#xff0c;若采用大端字节序&#xff0c;则该整数在内存中的存储顺序是&a…

AppScan-被动手动扫描

被动扫描是针对性的扫描&#xff0c;浏览器代理到AppScan&#xff0c;然后进行手工操作&#xff0c;探索产生出的流量给AppScan进行扫描。这样可以使得扫描足够精准&#xff0c;覆盖率更加高&#xff0c;还能减少不必要的干扰 &#xff08;一&#xff09;环境准备 1、火狐安装…

SAP UI5 之Controls (控件) 笔记三

文章目录 官网 Walkthrough学习-Controls控件1.0.1 在index.html中使用class id 属性控制页面展示的属性1.0.2 我们在index.js文件中引入 text文本控制1.0.3打开浏览器查看结果 官网 Walkthrough学习-Controls控件 Controls控件 在前面展示在浏览器中的Hello World 是在Html …

Presto 之Hash Join的Partition

一. 前言 在Presto中&#xff0c;当两表Join为Hash Join并且join_distribution_type为PARTITIONED的时候&#xff0c;Presto会将Build表分区&#xff08;Partition&#xff09;后再进行Join操作。在Presto中的Join操作中&#xff0c;对表的分区有两级&#xff0c;第一级是将Has…

超简单搭建一个自用的ChatGPT网站(支持给网站添加访问密码)

前言&#xff1a; 有小伙伴留言想在自己的服务器搭建上图所示的ChatGPT网站&#xff0c;那么今天就是教大家如何在自己的服务器搭建像上图所示的ChatGPT网站 准备条件&#xff1a; 1&#xff09;一台服务器(这里用centos7) 2&#xff09;ChatGPT的API-KEY 一、Docker环境部署…

存储资源调优技术——SmartThin智能精简配置技术

目录 基本概念 工作原理 SmartThin关键技术 SmartThin主要功能 应用场景 精简LUN&#xff0c;存储空间超分配 按需动态分配存储资源&#xff0c;提高存储资源利用率 Thick和Thin LUN的区别如下 基本概念 Thin Lun属于存储资源的虚拟化&#xff0c;因此需要基于RAID 2.0存…

当影像遇上Python:用MoviePy库轻松搞定视频编辑

I. 简介 当影像遇上Python&#xff1a;用MoviePy库轻松搞定视频编辑 I. 简介II. 安装III. 使用 &#x1f680;&#x1f3ac;1. 创建一个视频剪辑对象2. 剪辑视频3. 剪切视频片段4. 改变视频尺寸和速度5. 合并视频6. 合并多个视频7. 用混合模式合并视频8. 添加音频9. 添加背景音…

台北房价预测

目录 1.数据理解1.1分析数据集的基本结构&#xff0c;查询并输出数据的前 10 行和 后 10 行1.2识别并输出所有变量 2.数据清洗2.1输出所有变量折线图2.2缺失值处理2.3异常值处理 3.数据分析3.1寻找相关性3.2划分数据集 4.数据整理4.1数据标准化 5.回归预测分析5.1线性回归&…

C++之深入解析如何实现一个线程池

一、基础概念 当进行并行的任务作业操作时&#xff0c;线程的建立与销毁的开销是&#xff0c;阻碍性能进步的关键&#xff0c;因此线程池&#xff0c;由此产生。使用多个线程&#xff0c;无限制循环等待队列&#xff0c;进行计算和操作&#xff0c;帮助快速降低和减少性能损耗…

Linux-初学者系列4_rpm-yum软件包管理

Linux-初学者系列4_rpm-yum软件包管理 一、软件包管理 系统软件安装后默认目录路径&#xff1a; /user/local /opt这两个目录用来存放用户自编译安装软件的目录&#xff0c;对于通过源码包安装的软件&#xff0c;如果没有指定安装目录&#xff0c;一般会装在以上目录中。 使…

利用Python轻松实现视频合成!

&#x1f3a5; 利用Python轻松实现视频合成&#xff01;&#x1f4bb; 你是否曾经尝试过在一个视频中添加另一个小视频的场景呢&#xff1f;如果是&#xff0c;你一定会知道这是一项令人头疼的任务。但是&#xff0c;有了Python的 moviepy 库&#xff0c;这个任务将变得非常简单…

Java AIO(Java Asynchronous I/O:异步非阻塞IO)

1.基本介绍 1>.JDK7引入了Asynchronous I/O,即AIO.在进行I/O编程中,常用到两种模式:Reactor和Proactor; 2>.Java的NIO就是Reactor,当有事件触发时,服务器端得到通知,进行相应的处理; 3>.AIO即NIO2.0,叫做异步不阻塞的IO.AIO引入了异步通道的概念,采用了Proactor模式…

Java之类和对象

一、类和对象 C和Java都是面向对象编程的语言,而C和Go是面向过程编程的语言. 主要概述一下面向对象编程,也就是op.在面向对象的世界中,一切皆对象.解决问题的途径主要是靠对象之间的交互去完成. 类的模板 类就是对一种事物的概述,比如说猫类,狗类,人类等等,在这些类中,有成…

为什么WEB端通常采用3DTILES 格式进行发布?

为什么WEB端通常采用3DTILES 格式进行发布? 随着互联网技术的发展和普及&#xff0c;Web端三维数据可视化和呈现越来越受到关注和重视。在这个背景下&#xff0c;采用合适的标准格式进行数据发布和交换变得尤为重要。3DTILES是一种新型的三维数据标准格式&#xff0c;具有多种…

数据降维 | MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化

数据降维 | MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化 目录 数据降维 | MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化基本介绍模型描述程序设计学习小结基本介绍 MATLAB实现基于LFDA基于局部费歇尔判别的分类数据降维可视化 模型描述 局部费歇尔…

Linux之【多线程】线程互斥(锁)线程同步(条件变量)

Linux之【多线程】线程互斥&#xff08;锁&#xff09;&线程同步&#xff08;条件变量&#xff09; 一、引入&#xff1a;线程安全问题二、浅谈""和"- -"非原子性操作三、Linux线程互斥3.1 互斥量-->mutex⚠️3.1.1 互斥锁的理解3.1.2 深入了解锁的…

倾斜摄影超大场景的三维模型的顶层合并的优势浅析

倾斜摄影超大场景的三维模型的顶层合并的优势浅析 倾斜摄影超大场景的三维模型的顶层合并具有以下优势&#xff1a; 1、三维可视化效果好&#xff1a;通过倾斜摄影技术可以获得高分辨率的地面影像&#xff0c;将其与三维建模相结合可以生成非常逼真的三维场景。这种高度可视化…