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

    文章

    594

    浏览量

    23069
  • 代码
    +关注

    关注

    30

    文章

    4946

    浏览量

    73214
  • 编辑器
    +关注

    关注

    1

    文章

    826

    浏览量

    32680

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

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

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    电能质量在线监测装置支持密码复杂度要求吗?

    现代电能质量在线监测装置(尤其是中高端型号,适配电网安全要求)普遍支持密码复杂度要求 ,且部分装置会强制启用该功能,核心目的是防范弱密码导致的非法访问、数据篡改或设备操控风险,符合电力行业信息安全
    的头像 发表于 12-12 11:07 352次阅读

    探索ADC0831-N/ADC0832-N/ADC0834-N/ADC0838-N 8位串行I/O A/D转换器

    探索ADC0831-N/ADC0832-N/ADC0834-N/ADC0838-N 8位串行I/O A/D转换器 在电子设计领域,A/D转换
    的头像 发表于 12-10 10:55 207次阅读

    深入剖析ADC0831-N/ADC0832-N/ADC0834-N/ADC0838-N 8位串行I/O A/D转换器

    深入剖析ADC0831-N/ADC0832-N/ADC0834-N/ADC0838-N 8位串行I/O A/D转换器 在电子工程师的日常工作
    的头像 发表于 12-10 10:55 193次阅读

    免停电接线的电能质量在线监测装置的安装和调试复杂吗?

    免停电接线的电能质量在线监测装置 整体安装调试复杂度较低 ,远低于传统停电接线模式,其中低压系统可实现 “快速部署、简易调试”,中高压系统因需专业工具与资质,复杂度略有提升,但仍能通过标准化流程降低
    的头像 发表于 12-05 18:00 3366次阅读
    免停电接线的电能质量在线监测装置的安装和调试<b class='flag-5'>复杂</b>吗?

    程序运行慢,是否需检查算法时间复杂度过高?

    程序运行慢,需检查算法时间复杂度是否过高?
    发表于 11-17 08:08

    CT-4032-O/CT-4031-N铁氧体隔离器

    CT-4032-O与CT-4031-N均为UTE Microwave公司生产的铁氧体隔离器(Ferrite Isolators),其中CT-4032-O配备的是SMA母头连接器,而CT-4031-
    发表于 09-23 08:53

    CT-4028-O/CT-4027-N铁氧体隔离器

    CT-4028-O/CT-4027-N铁氧体隔离器:Ka波段高性能微波信号隔离解决方案CT-4028-O/CT-4027-N铁氧体隔离器是基于铁氧体材料的微波非互易器件,具备出色的单向
    发表于 08-12 09:43

    HDI盲埋孔PCB阶数区分方法解析

    HDI盲埋孔PCB的阶数是区分其结构复杂度的关键指标,主要通过增层次数、钻孔工艺及连接层数来综合判断,具体区分方法如下: 一、基于增层次数的阶数定义 HDI板结构通常以“a+N+a”或
    的头像 发表于 08-05 10:34 2366次阅读
    HDI盲埋孔PCB阶数区分<b class='flag-5'>方法</b>解析

    太阳光模拟器丨辐照不均匀的定义和标准

    在材料光电性能表征、新能源器件研发及空间环境模拟等前沿领域,太阳光模拟器已成为模拟真实光照环境的核心工具。辐照不均匀作为衡量太阳光
    的头像 发表于 07-24 10:23 578次阅读
    太阳光<b class='flag-5'>模拟</b>器丨辐照不均匀<b class='flag-5'>度</b>的定义和标准

    CT-3046-O\\CT-3045-N铁氧体环行器UTE Microwave

    质量要求高的场景;CT-3045-N虽然插入损耗较高,但隔离仍能满足一般应用需求。l 功率容量与温度稳定性 CT-3046-O的功率容量更高,温度稳定性更好,适合大功率和高可靠性
    发表于 05-23 10:06

    ADIN2111集成10BASE-T1L PHY的低复杂度、2端口以太网交换机技术手册

    ADIN2111是一款低功耗、低复杂度、双以太网端口交换机,它集成了10BASE-T1L PHY和一个串行外设接口(SPI)端口。该器件使用低功率受限节点,面向工业以太网应用且符合IEEE
    的头像 发表于 05-15 11:41 1255次阅读
    ADIN2111集成10BASE-T1L PHY的低<b class='flag-5'>复杂度</b>、2端口以太网交换机技术手册

    VirtualLab Fusion应用:多层超表面空间板的模拟

    的同时使系统尽可能小,解决元件之间的距离问题也是必要的。例如,可以通过将系统折叠起来,利用相同的体积实现多个传播步骤,但这并不是唯一可行的策略。 我们将介绍多层超表面空间板的模拟(由 O. Reshef
    发表于 04-09 08:51

    CT-3038-O/CT-3037-N铁氧体环行器UTE Microwave

    × 1英寸 连接器类型: CT-3038-O:SMA母头 CT-3037-NN母头 典型性能指标: 隔离:最低18 dB 插入损耗:最高0.40 dB 驻波比:最高1.30:1
    发表于 02-25 10:18

    N2O(一氧化二氮)气体和红外N2O(一氧化二氮)气体传感器

    本文聚焦一氧化二氮(NO,俗称笑气)。自然环境中,土壤微生物活动及海洋浮游生物等产生 NO ,海洋释放量约占全球自然源排放总量三分之一。但因农业、化石燃料燃烧等人类活动排放,
    的头像 发表于 01-22 14:45 2990次阅读
    <b class='flag-5'>N2O</b>(一氧化二氮)气体和红外<b class='flag-5'>N2O</b>(一氧化二氮)气体传感器

    AI时代下芯片复杂度飙升,思尔芯国产硬件仿真加速芯片创新

    引言在人工智能(AI)技术蓬勃发展的今天,芯片的复杂度正以前所未有的速度飙升,轻松跨越了百亿逻辑门级别的大关。这一趋势不仅推动了半导体行业的快速发展,也对硬件仿真系统提出了更高的挑战和要求。在近日
    的头像 发表于 12-27 18:01 1196次阅读
    AI时代下芯片<b class='flag-5'>复杂度</b>飙升,思尔芯国产硬件仿真加速芯片创新