【代码随想录刷题记录】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

相关文章

百度/小米/滴滴/京东,中台架构比较

小米中台建设实践 01 小米的三大中台建设:业务+数据+技术 业务中台--从业务说起 在中台建设中,需要规范化的服务接口、一致整合化的数据、容器化的技术组件以及弹性的基础设施。并结合业务情况,判定是否真的需要中台。 小米参考了业界优秀的案例包括移动中台、数据中台、业务中台、技术中台等,再结合其业务发展历程及业务现状,整理了中台架构的核心方法论,一是企业如何共享服务,二是如何为业务提供便利。

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

Node.js学习记录(二)

目录 一、express 1、初识express 2、安装express 3、创建并启动web服务器 4、监听 GET&POST 请求、响应内容给客户端 5、获取URL中携带的查询参数 6、获取URL中动态参数 7、静态资源托管 二、工具nodemon 三、express路由 1、express中路由 2、路由的匹配 3、路由模块化 4、路由模块添加前缀 四、中间件

代码随想录冲冲冲 Day39 动态规划Part7

198. 打家劫舍 dp数组的意义是在第i位的时候偷的最大钱数是多少 如果nums的size为0 总价值当然就是0 如果nums的size为1 总价值是nums[0] 遍历顺序就是从小到大遍历 之后是递推公式 对于dp[i]的最大价值来说有两种可能 1.偷第i个 那么最大价值就是dp[i-2]+nums[i] 2.不偷第i个 那么价值就是dp[i-1] 之后取这两个的最大值就是d

pip-tools:打造可重复、可控的 Python 开发环境,解决依赖关系,让代码更稳定

在 Python 开发中,管理依赖关系是一项繁琐且容易出错的任务。手动更新依赖版本、处理冲突、确保一致性等等,都可能让开发者感到头疼。而 pip-tools 为开发者提供了一套稳定可靠的解决方案。 什么是 pip-tools? pip-tools 是一组命令行工具,旨在简化 Python 依赖关系的管理,确保项目环境的稳定性和可重复性。它主要包含两个核心工具:pip-compile 和 pip

D4代码AC集

贪心问题解决的步骤: (局部贪心能导致全局贪心)    1.确定贪心策略    2.验证贪心策略是否正确 排队接水 #include<bits/stdc++.h>using namespace std;int main(){int w,n,a[32000];cin>>w>>n;for(int i=1;i<=n;i++){cin>>a[i];}sort(a+1,a+n+1);int i=1

记录每次更新到仓库 —— Git 学习笔记 10

记录每次更新到仓库 文章目录 文件的状态三个区域检查当前文件状态跟踪新文件取消跟踪(un-tracking)文件重新跟踪(re-tracking)文件暂存已修改文件忽略某些文件查看已暂存和未暂存的修改提交更新跳过暂存区删除文件移动文件参考资料 咱们接着很多天以前的 取得Git仓库 这篇文章继续说。 文件的状态 不管是通过哪种方法,现在我们已经有了一个仓库,并从这个仓

html css jquery选项卡 代码练习小项目

在学习 html 和 css jquery 结合使用的时候 做好是能尝试做一些简单的小功能,来提高自己的 逻辑能力,熟悉代码的编写语法 下面分享一段代码 使用html css jquery选项卡 代码练习 <div class="box"><dl class="tab"><dd class="active">手机</dd><dd>家电</dd><dd>服装</dd><dd>数码</dd><dd