0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

空间复杂度O(n)的栈模拟方法

算法与数据结构 来源:代码随想录 作者:代码随想录 2022-07-10 17:24 次阅读
这种匹配(消除)问题也是栈的擅长所在!

844.比较含退格的字符串

给定 S 和 T 两个字符串,当它们分别被输入到空白的文本编辑器后,判断二者是否相等,并返回结果。# 代表退格字符。

注意:如果对空文本输入退格字符,文本继续为空。 示例 1:

  • 输入:S = "ab#c", T = "ad#c"
  • 输出:true
  • 解释:S 和 T 都会变成 “ac”。

示例 2:

  • 输入:S = "ab##", T = "c#d#"
  • 输出:true
  • 解释:S 和 T 都会变成 “”。

示例 3:

  • 输入:S = "a##c", T = "#a#c"
  • 输出:true
  • 解释:S 和 T 都会变成 “c”。

示例 4:

  • 输入:S = "a#c", T = "b"
  • 输出:false
  • 解释:S 会变成 “c”,但 T 仍然是 “b”。

思路

本文将给出 空间复杂度O(n)的栈模拟方法 以及空间复杂度是O(1)的双指针方法。

普通方法(使用栈的思路)

这道题目一看就是要使用栈的节奏,这种匹配(消除)问题也是栈的擅长所在,跟着一起刷题的同学应该知道,在栈与队列:匹配问题都是栈的强项,我就已经提过了一次使用栈来做类似的事情了。

那么本题,确实可以使用栈的思路,但是没有必要使用栈,因为最后比较的时候还要比较栈里的元素,有点麻烦

这里直接使用字符串string,来作为栈,末尾添加和弹出,string都有相应的接口,最后比较的时候,只要比较两个字符串就可以了,比比较栈里的元素方便一些。

代码如下:

classSolution{
public:
boolbackspaceCompare(stringS,stringT){
strings;//当栈来用
stringt;//当栈来用
for(inti=0;i< S.size(); i++) {
            if(S[i]!='#')s+=S[i];
elseif(!s.empty()){
s.pop_back();

}
for(inti=0;i< T.size(); i++) {
            if(T[i]!='#')t+=T[i];
elseif(!t.empty()){
t.pop_back();
}
}
if(s==t)returntrue;//直接比较两个字符串是否相等,比用栈来比较方便多了
returnfalse;
}
};
  • 时间复杂度:O(n + m), n为S的长度,m为T的长度 ,也可以理解是O(n)的时间复杂度
  • 空间复杂度:O(n + m)

当然以上代码,大家可以发现有重复的逻辑处理S,处理T,可以把这块公共逻辑抽离出来,代码精简如下:

classSolution{
private:
stringgetString(conststring&S){
strings;
for(inti=0;i< S.size(); i++) {
        if(S[i]!='#')s+=S[i];
elseif(!s.empty()){
s.pop_back();
}
}
returns;
}
public:
boolbackspaceCompare(stringS,stringT){
returngetString(S)==getString(T);
}
};

性能依然是:

  • 时间复杂度:O(n + m)
  • 空间复杂度:O(n + m)

优化方法(从后向前双指针)

当然还可以有使用 O(1) 的空间复杂度来解决该问题。

同时从后向前遍历S和T(i初始为S末尾,j初始为T末尾),记录#的数量,模拟消除的操作,如果#用完了,就开始比较S[i]和S[j]。

动画如下:

1abd8eba-f681-11ec-ba43-dac502259ad0.gif

如果S[i]和S[j]不相同返回false,如果有一个指针(i或者j)先走到的字符串头部位置,也返回false。

代码如下:

classSolution{
public:
boolbackspaceCompare(stringS,stringT){
intsSkipNum=0;//记录S的#数量
inttSkipNum=0;//记录T的#数量
inti=S.size()-1;
intj=T.size()-1;
while(1){
while(i>=0){//从后向前,消除S的#
if(S[i]=='#')sSkipNum++;
else{
if(sSkipNum>0)sSkipNum--;
elsebreak;
}
i--;
}
while(j>=0){//从后向前,消除T的#
if(T[j]=='#')tSkipNum++;
else{
if(tSkipNum>0)tSkipNum--;
elsebreak;
}
j--;
}
//后半部分#消除完了,接下来比较S[i]!=T[j]
if(i< 0||j< 0)break;//S或者T遍历到头了
if(S[i]!=T[j])returnfalse;
i--;j--;
}
//说明S和T同时遍历完毕
if(i==-1&&j==-1)returntrue;
returnfalse;
}
};
  • 时间复杂度:O(n + m)
  • 空间复杂度:O(1)
审核编辑:汤梓红

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 字符串
    +关注

    关注

    1

    文章

    578

    浏览量

    20493
  • 代码
    +关注

    关注

    30

    文章

    4761

    浏览量

    68405
  • 编辑器
    +关注

    关注

    1

    文章

    803

    浏览量

    31136

原文标题:比较含退格的字符串

文章出处:【微信号:TheAlgorithm,微信公众号:算法与数据结构】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    DoIP协议简介及主要功能

    随着汽车的智能化和网联化,车载电子系统的复杂度不断增加,对数据通信的带宽需求越来越大,通信速度要求也越来越高。借助于传统因特网的成熟技术,引入到车载网络得以解决当前的通信需求,通过对传统以太网的技术
    的头像 发表于 11-13 15:35 354次阅读
    DoIP协议<b class='flag-5'>栈</b>简介及主要功能

    热真空试验箱 空间环境地面模拟试验设备

    产品用途:空间环境地面模拟试验设备用于军工和航天产品在地面环境中模拟太空的真空、冷黑和太阳辐射的环境,进行热真空试验和热平衡试验。空间环境地面模拟
    的头像 发表于 11-01 11:16 103次阅读
    热真空试验箱 <b class='flag-5'>空间</b>环境地面<b class='flag-5'>模拟</b>试验设备

    线程分配惹的祸?系统异常这样解决!

    ,尤其当项目规模扩大、代码复杂度增加时,各种“难以捉摸”的bug便会频繁出现,令工程师们一头雾水,不知从何入手。这些问题可能涉及内存管理、任务调度、溢出等复杂
    的头像 发表于 10-31 08:08 515次阅读
    线程<b class='flag-5'>栈</b>分配惹的祸?系统异常这样解决!

    时间复杂度O(n^2) 的排序算法

    作者:京东保险 王奕龙 对于小规模数据,我们可以选用时间复杂度O(n2) 的排序算法。因为时间复杂度并不代表实际代码的执行时间,它省去了低阶、系数和常数,仅代表的增长趋势,所以在小
    的头像 发表于 10-19 16:31 1061次阅读
    时间<b class='flag-5'>复杂度</b>为 <b class='flag-5'>O</b>(<b class='flag-5'>n</b>^2) 的排序算法

    PCB与PCBA工艺复杂度的量化评估与应对措施

    一站式PCBA智造厂家今天为大家讲讲PCBA工艺复杂吗?PCBA工艺的复杂性应对PCBA工艺复杂性的措施。在电子制造领域,PCBA工艺是至关重要的环节。尽管对许多人来说,PCBA工艺可能看似
    的头像 发表于 09-13 09:21 375次阅读

    业务复杂度治理方法论--十年系统设计经验总结

    一、复杂度综述 1、什么是复杂度 软件设计的核心在于降低复杂性。 --《软件设计的哲学》 业界对于复杂度并没有统一的定义, 斯坦福教授John Ousterhout从认知负担和工作量方
    的头像 发表于 09-05 14:11 950次阅读
    业务<b class='flag-5'>复杂度</b>治理<b class='flag-5'>方法</b>论--十年系统设计经验总结

    CISC(复杂指令集)与RISC(精简指令集)的区别  

    复杂度, 将复杂性交给编译器。举一个例子,CISC提供的乘法指令,调用时可完成内存a和内存b中的两个数相乘,结果存入内存a ,需要多个CPU周期才可以完成;而RISC不提供“一站式”的乘法指令,需
    发表于 07-30 17:21

    复杂电磁环境模拟系统设计方案

    智慧华盛恒辉复杂电磁环境模拟系统的设计方案是一个综合性的工程任务,涉及多个方面的考虑和技术实现。以下是一个基于现有技术和应用需求的设计方案概述: 智慧华盛恒辉系统目标 复杂电磁环境模拟
    的头像 发表于 07-17 17:06 387次阅读

    PCB与PCBA工艺复杂度的量化评估与应用初探!

    , 不知道如何区分普通和复杂的PCB和 PCBA的设计,并采用什么样的方式来处理。 基于上述考虑, 我们参考了业 界已有的作法, 设计了一个PCB 和 PCBA的工艺复杂度计算公式以解决这 方面
    发表于 06-14 11:15

    模拟示波器和模拟万用表的区别

    在电子测量领域,模拟示波器和模拟万用表是两种常用的工具,它们各自具有独特的功能和用途。本文将对模拟示波器和模拟万用表进行详细比较,从工作原理、使用场景、操作
    的头像 发表于 05-15 18:07 542次阅读

    软件可配置模拟 I/O 的设计理念

    作者: Kenton Williston 曾几何时,模拟 I/O 就是最专业、功能最固定的硬件。例如,电流驱动器和电压传感器是完全不同的零件,试图颠倒其角色可谓是荒谬至极。 软件可配置模拟 I/
    的头像 发表于 05-05 11:10 806次阅读
    软件可配置<b class='flag-5'>模拟</b> I/<b class='flag-5'>O</b> 的设计理念

    gis中常用的空间分析方法

    GIS中常用的空间分析方法 GIS(地理信息系统)是一种用于收集、存储、处理、分析和展示地理数据的技术。空间分析是GIS的核心部分,它包括一系列方法和技术,用来研究地理
    的头像 发表于 02-25 13:44 5212次阅读

    java虚拟机内存包括远空间内存吗

    Java虚拟机(JVM)内存是Java程序执行时所使用的内存空间的总称,包括了Java堆、方法区、本地方法、虚拟机和程序计数器等多个部分
    的头像 发表于 12-05 14:15 387次阅读

    时间复杂度O (nlogn)的排序算法简述

    归并排序遵循分治的思想:将原问题分解为几个规模较小但类似于原问题的子问题,递归地求解这些子问题,然后合并这些子问题的解来建立原问题的解。
    的头像 发表于 12-05 09:57 562次阅读
    时间<b class='flag-5'>复杂度</b>为<b class='flag-5'>O</b> (nlogn)的排序算法简述

    降低Transformer复杂度O(N^2)的方法汇总

    首先来详细说明为什么Transformer的计算复杂度是 。将Transformer中标准的Attention称为Softmax Attention。令 为长度为 的序列, 其维度为 , 。 可看作Softmax Attention的输入。
    的头像 发表于 12-04 15:31 1088次阅读
    降低Transformer<b class='flag-5'>复杂度</b><b class='flag-5'>O</b>(<b class='flag-5'>N</b>^2)的<b class='flag-5'>方法</b>汇总