【代码随想录刷题记录】LeetCode844比较含退格的字符

news2025/2/24 15:10:24

题目地址

1. 思路

1.1 基本思路

拿到这个题,我们要单独写一个函数去将退格后的字符串结果返回出来(生成退格后的真实的字符串),我还是想魔改 O ( n ) O(n) O(n)时间复杂度的删除数组元素的算法:【代码随想录刷题记录】LeetCode27移除元素
那我们就需要思考一下,这个算法中的slow和fast指针的关系,我们都知道,当遇到要删除的元素,slow会停下来,而fast会继续自增,而我们要删除的元素的范围实际上是[slow, fast),左闭右开,我们看一下之前的代码:

class Solution {
public:
    // 引用传递,直接改nums,是改其本身,不是拷贝
    int removeElement(vector<int>& nums, int val) {
        int slow = 0; //慢指针,用来记录删除该元素后,每个元素对应的新下标slow
        for(int fast = 0; fast < nums.size(); fast++)
        {
            if(val != nums[fast])
            {
                // 下一次循环必须先执行赋值操作再进行slow的自增
                nums[slow] = nums[fast];
                slow++;
            }       
        }
        return slow;
    }
};

假设我们要删除的是3,数组nums是[1,1,3,3,2]
fast=0

由于 nums[fast] = nums [ 0 ] = 1 ≠ val = 3 \text{nums[fast]}=\text{nums}[0]=1\ne\text{val}=3 nums[fast]=nums[0]=1=val=3,则

fast=1

由于 nums[fast] = nums [ 1 ] = 1 ≠ val = 3 \text{nums[fast]}=\text{nums}[1]=1\ne\text{val}=3 nums[fast]=nums[1]=1=val=3,则

fast=2

由于 nums[fast] = nums [ 2 ] = 3 = val = 3 \text{nums[fast]}=\text{nums}[2]=3=\text{val}=3 nums[fast]=nums[2]=3=val=3,则什么也不做,进入下一次循环

fast=3


由于 nums[fast] = nums [ 3 ] = 3 = val = 3 \text{nums[fast]}=\text{nums}[3]=3=\text{val}=3 nums[fast]=nums[3]=3=val=3,则什么也不做,进入下一次循环
fast=4

由于 nums[fast] = nums [ 4 ] = 2 ≠ val = 3 \text{nums[fast]}=\text{nums}[4]=2\ne\text{val}=3 nums[fast]=nums[4]=2=val=3,则

这个时候,循环就停止了,slow是新数组的长度,但是我们仔细看到这个删除的过程,在最后一轮循环的时候,删除的范围是[slow, fast),即

那我们再一次回看这个删除的区间和现在的这个题目,我们要删除的是#和#之前的字符,那我们的删除的区间就是[slow-1,fast),那就说明, fast所指元素在遍历的时候如果是#(也就是增加了一个else条件),那就应该让slow自减,但是slow自减只有在slow下标合法也即slow不是0的时候才能自减,我们把上面那个数组换成字符串即[a,b,#,#,c]

如果我们想要单纯删除#,当然还可以保持原有的逻辑,但是我们要删除的区间要扩大,相当于退了两个单位(假设没有nums[slow]=nums[fast]这个过程)

这个才是我们理想的删除情况,它的具体过程应该追溯到fast为2的时候(因为之前的流程和没加else条件的slow–是一样的):
fast=2

由于 nums[fast] = nums [ 2 ] = # = val = # \text{nums[fast]}=\text{nums}[2]=\#=\text{val}=\# nums[fast]=nums[2]=#=val=#,则slow–

fast=3

由于 nums[fast] = nums [ 3 ] = # = val = # \text{nums[fast]}=\text{nums}[3]=\#=\text{val}=\# nums[fast]=nums[3]=#=val=#,则slow–

此时,我们成功找到了删除的区间
fast=4

由于 nums[fast] = nums [ 4 ] = c ≠ val = # \text{nums[fast]}=\text{nums}[4]=\text{c}\ne\text{val}=\# nums[fast]=nums[4]=c=val=#,则

这个时候,slow对应的是新字符串的长度,新字符串中只有一个字符c
但是单纯地加上这样一个else条件也是不行的,如果字符串是[#, #, c]的话,最开始遇到#退格,slow会向左越界,会变成-1,所以只有在slow没到0的时候(也即大于0的时候)才能slow自减。
我们生成退格后的真实的字符串后,再对比两个字符串就能返回出结果

1.2 代码实现

从上面的内容得知,代码实现如下,这次没有做验证,直接顺利通过:

class Solution {
public:
    //生成退格后的真实的字符串
    string genRealString(string s)
    {
        int n = s.size(); // 字符串长度
        int slow = 0;
        string result = ""; // 要返回的字符串
        for (int fast = 0; fast < n; fast++)
        {
            //当前遇到不是#就自增,和O(n)时间复杂度删除数组中某个元素的方法类似
            if (s[fast] != '#')
            {
                s[slow] = s[fast];
                slow++;
            }
            //不同于删除数组中某个元素的方法,它需要在遇到#后让slow后退一个位置
            //因为我们要删除的是#之前的字符
            else
            {
                //如果slow没向左越界就自减,因为假设#在下标为0的位置,则其退格
                //相当于没退格,但是#需要删除,所以此时slow不需要自减1
                //其他情况需要自减1(将要删除元素的范围是#和其前面的元素,
                //删除元素的范围是[slow,fast),所以slow自减是为了将#之前的元素删除
                if(slow > 0)
                {
                    slow--;
                }
            }
        }
        result = s.substr(0, slow); // 截取从0开始,长度为slow的字符串
        return result;
    }
    bool backspaceCompare(string s, string t) {
        string a = genRealString(s);
        string b = genRealString(t);
        return a == b;
    }
};

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

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

相关文章

认识Linux及一些基本

目录 linux简介&#xff1a; 1. 发展史 UNIX发展的历史 Linux发展历史 2. 开源 3. 企业应用现状 Linux在服务器领域的发展 Linux在桌面领域的发展 Linux在移动嵌入式领域的发展 Linux在云计算/大数据领域的发展 4. 发行版本 Debian Ubuntu 红帽企业级Linux Cent…

LLDP简介

LLDP简介 定义 LLDP&#xff08;Link Layer Discovery Protocol&#xff09;是IEEE 802.1ab中定义的链路层发现协议。LLDP是一种标准的二层发现方式&#xff0c;可以将本端设备的管理地址、设备标识、接口标识等信息组织起来&#xff0c;并发布给自己的邻居设备&#xff0c;邻…

国产Sora诞生!清华团队发布Vidu大模型,可直接生成16秒视频

大模型之争已从单模态转向多模态。 4月27日&#xff0c;在2024中关村论坛年会未来人工智能先锋论坛上&#xff0c;清华大学联合北京生数科技有限公司正式发布了文生视频大模型——Vidu。 在会议上&#xff0c;清华大学人工智能研究院副院长、生数科技首席科学家朱军对外展示了…

溪谷软件:游戏联运有多简单?

游戏联运&#xff0c;即游戏联合运营&#xff0c;是一种游戏运营模式&#xff0c;涉及到多个平台或公司共同推广和运营同一款游戏。对于开发者而言&#xff0c;游戏联运的简化程度可能因具体情况而异&#xff0c;但以下是一些因素&#xff0c;使得游戏联运在某种程度上变得更加…

​水滴式饲料粉碎机:创新设计与卓越性能的完美结合

水滴式饲料粉碎机是一种新型的饲料加工设备&#xff0c;其新颖的设计理念和工作性能受到了广大养殖户和饲料生产厂家的青睐。水滴式饲料粉碎机之所以受到如此广泛的关注&#xff0c;不仅是因为其G效、节能的特点&#xff0c;更是因为其新颖的结构设计&#xff0c;使得饲料加工过…

Cesium.js(3):Cesium查看器、场景、实体、数据源介绍

1 Cesium的四大类说明 1.1 Viewer查看器类 Viewer是cesium的查看器类&#xff0c;第一个参数是地图主窗口DIV的容器ID&#xff0c;第二个参数option是Viewer的可选设置参数&#xff0c;包含图层、地形时间系统等参数&#xff0c;种类多样&#xff0c;主要作用是对视口中各个组…

【Python的魅力】:利用Pygame实现游戏坦克大战——含完整源码

文章目录 一、游戏运行效果二、代码实现2.1 项目搭建2.2 加载我方坦克2.3 加载敌方坦克2.4 添加爆炸效果2.5 坦克大战之音效处理 三、完整代码 一、游戏运行效果 二、代码实现 坦克大战游戏 2.1 项目搭建 本游戏主要分为两个对象&#xff0c;分别是我方坦克和敌方坦克。用户可…

数据结构复习指导之数组和特殊矩阵

文章目录 数组和特殊矩阵 考纲内容 复习提示 前言 1.数组的定义 2.数组的存储结构 3.特殊矩阵的压缩存储 3.1对称矩阵 3.2三角矩阵 3.3三对角矩阵 4.稀疏矩阵 5.知识回顾 数组和特殊矩阵 考纲内容 &#xff08;一&#xff09;栈和队列的基本概念 &#xff08;二&a…

数据结构六:线性表之顺序栈的设计

目录 一、栈的应用场景 二、栈的基本概念和结构 2.1 栈的基本概念 2.2 栈的结构 2.3 栈的实现方式 三、顺序栈的接口函数实现 3.0 顺序栈的概念和结构 3.1 顺序栈的接口函数 3.2 顺序栈的设计&#xff08;结构体&#xff09; 3.3 顺序栈的初始化 3.4 入栈&#x…

Python转换文本文件为PDF文档,绘制文本到PDF文档页面

文本文件因其轻便、易编辑的优势&#xff0c;常用于日常文字记录与数据交换&#xff1b;而PDF文档则以高保真、格式稳定和良好的阅读体验&#xff0c;成为正式报告、文献发布等场景的首选。将文本文件转为PDF&#xff0c;在PDF内精准绘制文本&#xff0c;旨在兼顾内容的规范呈现…

云计算革新:以太网 Scale-UP 网络为 GPU 加速赋能

谈谈基于以太网的GPU Scale-UP网络 Intel Gaudi-3 采用 RoCE 互联技术&#xff0c;促进了 Scale-UP 解决方案。业界专家 Jim Keller 倡导以太网替代 NVLink。Tenstorrent 成功应用以太网实现片上网络互联。RoCE 和以太网已成为互联解决方案的新兴趋势&#xff0c;为高性能计算提…

区块链技术--编译BSV源码(v1.0.1)

编译好的可执行文件bitcoin-cli 和 bitcoind 下载: https://github.com/youngqqcn/QBlockChainNotes/blob/master/BTC%E7%B3%BB%E5%B1%B1%E5%AF%A8%E5%B8%81/my_bsv_v1.0.1.tar.gz 安装 libminiupnpc wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packa…

商店数据(六)

目录 41.短信发送记录表 42.职员登录记录表 43.会员登录记录表 ​44.后台菜单表 45.商城信息表 46.消息队列表 47.移动端首页按钮管理表 48.商城导航表 41.短信发送记录表 CREATE TABLE wst_log_sms (smsId int(11) NOT NULL AUTO_INCREMENT COMMENT 自增ID,smsSrc t…

IOCP实现UDP Server

IOCP实现UDP Server 1、IOCP原理图 参考文献1&#xff1a;IOCP详解-阿里云开发者社区 (aliyun.com) 参考文献2&#xff1a;IOCP编程之基本原理 - 史D芬周 - 博客园 (cnblogs.com) 原理图 同步以及异步 2、UDP Server代码以及测试代码 // iocpudpdemo.cpp : 此文件包含 &qu…

再谈钓鱼邮件

再谈钓鱼邮件 概述 最近对邮件的防御策略进行了更新&#xff0c;结合威胁情报和安全沙箱对收到的钓鱼邮件进行了分析&#xff0c;期望这些案例能对大家有所帮助。 网关上拦截的钓鱼邮件基本可以分三个类别&#xff1a;链接钓鱼邮件、附件钓鱼邮件以及邮件头伪造钓鱼邮件&…

在谷歌浏览器访问特定的网站 提示此网站无法提供安全连接

1、问题描述&#xff1a; 最近通过谷歌浏览器访问某些网址提示此网站无法提供安全连接&#xff0c;换一个浏览器就能正确打开&#xff01; 例子如下&#xff1a; 访问 https://baijiahao.baidu.com/s?id1788533041823242656 2、查找原因 通过控制台发现请求未有响应码&#xf…

【数据分析面试】34.填充NaN值 (Python:groupby/sort_value/ffill)

题目&#xff1a;填充NaN值 &#xff08;Python) 给定一个包含三列的DataFrame&#xff1a;client_id、ranking、value 编写一个函数&#xff0c;将value列中的NaN值用相同client_id的前一个非NaN值填充&#xff0c;按升序排列。 如果不存在前一个client_id&#xff0c;则返…

小红书从记忆机制解读信息检索,提出新范式获得 EACL Oral

近日&#xff0c;来自小红书搜索算法团队的论文《Generative Dense Retrieval: Memory Can Be a Burden》被自然语言处理领域国际会议 EACL 2024 接收为 Oral&#xff0c;接受率为 11.32%&#xff08;144/1271&#xff09;。 他们在论文中提出了一种新颖的信息检索范式——生成…

python环境安装jupyter

安装完毕之后下一步可以参考&#xff1a;配置jupyter的启动路径-CSDN博客 1 前提条件&#xff1a;python环境 系统&#xff1a;win10 python&#xff1a;本地已经有python&#xff0c;可以查看本地的python版本&#xff1a; C:\Users\PC>python --version Python 3.8.10 …

为什么本国货币的贬值会导致本国物价的上涨

本国货币贬值意味着其对外国货币的汇率下降&#xff0c;也就是说&#xff0c;同样数量的本国货币现在能兑换的外国货币减少了。这种情况下&#xff0c;本国货币的购买力相对于外国货币减弱了。本国货币贬值可能导致本国物价上涨的几个原因&#xff1a; 进口成本上升&#xff1a…