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

2024-04-29 01:04

本文主要是介绍【代码随想录刷题记录】LeetCode844比较含退格的字符,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

题目地址

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; //慢指针,用来记录删除该元素后,每个元素对应的新下标slowfor(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;}
};

这篇关于【代码随想录刷题记录】LeetCode844比较含退格的字符的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/944725

相关文章

解决IDEA报错:编码GBK的不可映射字符问题

《解决IDEA报错:编码GBK的不可映射字符问题》:本文主要介绍解决IDEA报错:编码GBK的不可映射字符问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录IDEA报错:编码GBK的不可映射字符终端软件问题描述原因分析解决方案方法1:将命令改为方法2:右下jav

利用Python调试串口的示例代码

《利用Python调试串口的示例代码》在嵌入式开发、物联网设备调试过程中,串口通信是最基础的调试手段本文将带你用Python+ttkbootstrap打造一款高颜值、多功能的串口调试助手,需要的可以了... 目录概述:为什么需要专业的串口调试工具项目架构设计1.1 技术栈选型1.2 关键类说明1.3 线程模

Python Transformers库(NLP处理库)案例代码讲解

《PythonTransformers库(NLP处理库)案例代码讲解》本文介绍transformers库的全面讲解,包含基础知识、高级用法、案例代码及学习路径,内容经过组织,适合不同阶段的学习者,对... 目录一、基础知识1. Transformers 库简介2. 安装与环境配置3. 快速上手示例二、核心模

Java的栈与队列实现代码解析

《Java的栈与队列实现代码解析》栈是常见的线性数据结构,栈的特点是以先进后出的形式,后进先出,先进后出,分为栈底和栈顶,栈应用于内存的分配,表达式求值,存储临时的数据和方法的调用等,本文给大家介绍J... 目录栈的概念(Stack)栈的实现代码队列(Queue)模拟实现队列(双链表实现)循环队列(循环数组

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

使用Java将DOCX文档解析为Markdown文档的代码实现

《使用Java将DOCX文档解析为Markdown文档的代码实现》在现代文档处理中,Markdown(MD)因其简洁的语法和良好的可读性,逐渐成为开发者、技术写作者和内容创作者的首选格式,然而,许多文... 目录引言1. 工具和库介绍2. 安装依赖库3. 使用Apache POI解析DOCX文档4. 将解析

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

在Spring Boot中浅尝内存泄漏的实战记录

《在SpringBoot中浅尝内存泄漏的实战记录》本文给大家分享在SpringBoot中浅尝内存泄漏的实战记录,结合实例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录使用静态集合持有对象引用,阻止GC回收关键点:可执行代码:验证:1,运行程序(启动时添加JVM参数限制堆大小):2,访问 htt

MySQL 中查询 VARCHAR 类型 JSON 数据的问题记录

《MySQL中查询VARCHAR类型JSON数据的问题记录》在数据库设计中,有时我们会将JSON数据存储在VARCHAR或TEXT类型字段中,本文将详细介绍如何在MySQL中有效查询存储为V... 目录一、问题背景二、mysql jsON 函数2.1 常用 JSON 函数三、查询示例3.1 基本查询3.2

使用Python实现全能手机虚拟键盘的示例代码

《使用Python实现全能手机虚拟键盘的示例代码》在数字化办公时代,你是否遇到过这样的场景:会议室投影电脑突然键盘失灵、躺在沙发上想远程控制书房电脑、或者需要给长辈远程协助操作?今天我要分享的Pyth... 目录一、项目概述:不止于键盘的远程控制方案1.1 创新价值1.2 技术栈全景二、需求实现步骤一、需求