(字符串) 844. 比较含退格的字符串——【Leetcode每日一题】

news2024/12/22 13:14:50

❓844. 比较含退格的字符串

难度:简单

给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true# 代表退格字符。

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

示例 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 = “b”
输出:false
解释:s 会变成 “c”,但 t 仍然是 “b”。

提示

  • 1 <= s.length, t.length <= 200
  • st 只含有小写字母以及字符 '#'

进阶

  • 你可以用 O ( n ) O(n) O(n) 的时间复杂度和 O ( 1 ) O(1) O(1) 的空间复杂度解决该问题吗?

💡思路:

法一:栈

  • 使用栈将给定的字符串中的退格符 # 和 应当被删除的字符都去除;
  • 然后比较栈中两字符串是否相等即可。

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

我们定义两个指针,分别指向两字符串的末尾( i 初始为 s 末尾,j 初始为 t 末尾),同时从后向前遍历 st

再定义 s_skipt_skip 表示当前待删除的字符的数量。

每次我们遍历到一个字符:

  • 该字符为退格符 # ,则我们需要多删除一个普通字符,我们让 skip1
  • 若该字符为普通字符,让 skip1;。

每次我们让两指针逆序地遍历两字符串,直到两字符串能够各自确定一个字符,然后将这两个字符进行比较。重复这一过程直到找到的两个字符不相等,或遍历完字符串为止。

动画如下:
在这里插入图片描述

🍁代码:(Java、C++)

法一:栈
Java

class Solution {
    public boolean backspaceCompare(String s, String t) {
        Stack<Character> stk1 = new Stack<>();
        Stack<Character> stk2 = new Stack<>();
        for(char c : s.toCharArray()){
            if(c != '#') stk1.push(c);
            else if(!stk1.empty()) stk1.pop();
        }
        for(char c : t.toCharArray()){
            if(c != '#') stk2.push(c);
            else if(!stk2.empty()) stk2.pop();
        }
        if(stk1.size() != stk2.size()) return false;
        while(!stk1.empty()){
            if(stk1.peek() != stk2.peek())return false;
            stk1.pop();
            stk2.pop();
        }
        return true;
    }
}

C++

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        stack<char> stk1, stk2;
        for(char c : s){
            if(c != '#') stk1.push(c);
            else if(!stk1.empty()) stk1.pop();
        }
        for(char c : t){
            if(c != '#') stk2.push(c);
            else if(!stk2.empty()) stk2.pop();
        }
        if(stk1.size() != stk2.size()) return false;
        while(!stk1.empty()){
            if(stk1.top() != stk2.top())return false;
            stk1.pop();
            stk2.pop();
        }
        return true;
    }
};

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

class Solution {
    public boolean backspaceCompare(String s, String t) {
        int i = s.length() - 1, j = t.length() - 1;
        int s_skip = 0, t_skip = 0;
        while(true){
            while(i >= 0 && (s.charAt(i) == '#' || s_skip > 0)){// 从后向前,消除s的#
                if(s.charAt(i) == '#') s_skip++;
                else s_skip--;
                i--;
            }
            while(j >= 0 && (t.charAt(j) == '#' || t_skip > 0)){// 从后向前,消除t的#
                if(t.charAt(j) == '#') t_skip++;
                else t_skip--;
                j--;
            }
            // 后半部分#消除完了,接下来比较s[i] != t[j]
            if (i < 0 || j < 0) break; // s 或者t 遍历到头了
            if (s.charAt(i) != t.charAt(j)) return false;
            i--;j--;
        }
        return i == j;
    }
}

C++

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        int i = s.size() - 1, j = t.size() - 1;
        int s_skip = 0, t_skip = 0;
        while(1){
            while(i >= 0 && (s[i] == '#' || s_skip > 0)){// 从后向前,消除s的#
                if(s[i] == '#') s_skip++;
                else s_skip--;
                i--;
            }
            while(j >= 0 && (t[j] == '#' || t_skip > 0)){// 从后向前,消除t的#
                if(t[j] == '#') t_skip++;
                else t_skip--;
                j--;
            }
            // 后半部分#消除完了,接下来比较s[i] != t[j]
            if (i < 0 || j < 0) break; // s 或者t 遍历到头了
            if (s[i] != t[j]) return false;
            i--;j--;
        }
        return i == j;
    }
};

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n + m ) O(n+m) O(n+m),其中 nm 分别为字符串 st 的长度。我们需要遍历两字符串各一次。
  • 空间复杂度 O ( 1 ) O(1) O(1),对于每个字符串,我们只需要定义一个指针和一个计数器即可。法一为 O ( n + m ) O(n+m) O(n+m)

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

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

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

相关文章

【SpringBoot】整合Elasticsearch 快速入门操作索引

官网操作文档&#xff1a;Elasticsearch Clients | Elastic 踩坑太多了。。。这里表明一下Spring Boot2.4以上版本可能会出现问题&#xff0c;所以我降到了2.2.1.RELEASE。对于现在2023年6月而言&#xff0c;Es版本已经到了8.8&#xff0c;而SpringBoot版本已经到了3.x版…

【实战】Python爬虫之代理使用详解

在Python爬虫中&#xff0c;代理的使用非常常见。代理的主要作用是隐藏客户端的真实IP地址&#xff0c;从而实现更高的网络访问速度和更好的访问隐私保护。下面我们将通过Python爬虫的实例&#xff0c;带你详细了解Python爬虫中代理的使用方法。 目录 ## 1. 代理原理和作用 …

多维度员工信息整合查询——红海云员工信息数字化管理实用指南(中)

红海云员工全生命周期数字化管理平台从信息源头开始管控员工数据质量&#xff0c;在员工数据的采集、更新、审核环节采用多种方式保障员工信息的准确性、完整性、时效性和一致性&#xff0c;为企业搭建坚实可靠的人力资源管理数字化基座。但在有了准确可靠的员工数据基础后&…

APP测试应该从哪些方面入手?其实就这几点

前言 还在苦恼怎么去测APP吗&#xff1f; 一定要记住这几个方向&#xff0c;然后流程化的去执行&#xff0c;一来严谨规范&#xff0c;二来不会有遗漏。 1、需求检查&#xff1a; 在需求评审的时候展现你的业务能力啦&#xff01;不过还是得口下留情哟。&#xff08;PM心里瑟…

GitOps指南

GitOps基于CICD和IaC&#xff0c;以一致的方式管理代码和部署&#xff0c;是DevOps最佳实践之一。本文完整介绍了GitOps的理念和实践&#xff0c;并介绍了Weave Cloud的GitOps模型和工具&#xff0c;从整体上提供了实践GitOps的路径和方案。原文&#xff1a;Guide To GitOps[1]…

C++中的一些小技巧,numeric_limits、static_cast、reinterpret_cast方法内存验证

1、获取指定类型的最大值和最小值 在准备求一堆double数据中的最大值最小值的时候&#xff0c;常规做法是预估这堆数据的最大最小值&#xff0c;然后进行比较求&#xff0c;在重构别人代码的时候发现&#xff0c;可以准确知道double类型最大值或者最小值&#xff0c;获取方法如…

Apikit 自学日记:分享 API 文档

开启/关闭在线分享 您可以在线分享项目给团队以外的人&#xff0c;其他人可以通过分享链接在线查看API文档并且进行API测试。通过这种方式查看API文档不需要注册账号&#xff0c;用户可方便查看接口文档和测试接口。 在项目内&#xff0c;点击进入项目管理菜单&#xff0c;选择…

银河麒麟部署达梦8数据库开发者版本详细教程

我的系统信息如下&#xff1a; 系统架构&#xff1a;X86架构 系统信息&#xff1a;银河麒麟&#xff08;V10&#xff09; CPU&#xff1a;interl E5 官方安装文档&#xff1a;安装及卸载 | 达梦技术文档 (dameng.com) 数据库下载&#xff1a; 下载地址&#xff1a;产品下载…

【深度学习】2-5 神经网络-批处理

批处理&#xff08;Batch Processing&#xff09;是指在深度学习中每次迭代更新模型参数时同时处理多个样本的方式。 批处理时要注意对应维度的元素个数要一致 关于之前手写数字识别的例子&#xff1a; 用图表示&#xff0c;可以发现&#xff0c;多维数组的对应维度的元素个数…

体验DIY物联网浏览器(谷歌内核兼容性好支持H264视频播放)

一、功能及快捷键说明(说明32位兼容64位,版本往下看) 功能及快捷键图说明,不可多得的浏览器,支持右键自定义菜单... 二、下载安装包 2.1 版本 100.0.230 (支持H264版本)介绍 cefsharp物联网浏览器-支持H264(100.0.230)_cefsharp h264_久爱物联网的博客-CSDN博客 …

《论文阅读》用于情感分析的融合预训练表情符号特征增强

《论文阅读》用于情感分析的融合预训练表情符号特征增强 前言简介模型构架实验结果总结前言 你是否也对于理解论文存在困惑? 你是否也像我之前搜索论文解读,得到只是中文翻译的解读后感到失望? 小白如何从零读懂论文?和我一起来探索吧! 今天为大家带来的是《Fusion Pr…

SonarScanner扫描本地项目代码

一、Windows系统扫描 下载SonarScanner 去SonarQube官网下载相应系统的SonarScanner 点这里跳转 设置环境变量 下载好试个压缩文件&#xff0c;解压到你想存放的位置&#xff0c;设置环境变量 新增变量名&#xff1a;SONAR_SCANNER_HOME&#xff0c;值&#xff1a;你解压Sona…

ansible知识

在物理机查看环境&#xff0c;[kioskfoundation0 ~]$ cat /etc/rht 先清空当前环境&#xff0c;[kioskfoundation0 ~]$ rht-clearcourse 0 再切换rh294环境&#xff0c;[kioskfoundation0 ~]$ rht-setcourse rh294 验证环境是否切换成功&#xff0c;[kioskfoundation0 ~]$ cat…

2023年6月DAMA-CDGA/CDGP数据治理工程师认证找这家

DAMA认证为数据管理专业人士提供职业目标晋升规划&#xff0c;彰显了职业发展里程碑及发展阶梯定义&#xff0c;帮助数据管理从业人士获得企业数字化转型战略下的必备职业能力&#xff0c;促进开展工作实践应用及实际问题解决&#xff0c;形成企业所需的新数字经济下的核心职业…

清北「学渣」创业心路:AI 新时代已来,不参与对不起自己

内容一览&#xff1a;近日&#xff0c;HyperAI 超神经有幸接触到 SegmentFault AIGC Hackathon 2023 北京站二等奖获得者 OAISIS 团队&#xff0c;与他们畅聊了本次参赛的心路历程以及比赛之外团队的工作和生活。交谈中&#xff0c;三位年轻人显露出的自信、沉着、从容令人印象…

自动识别字幕

抖音官方出品的视频剪辑工具&#xff0c;国内版本和网易见外工作台一样&#xff0c;智能生成字幕功能只能识别中文和英文两种语言。 但是剪映国际版就支持英语、日语、韩语、葡萄牙语、俄语、印度尼西亚语、西班牙语还有德语总共八种语言。 剪映国际版字幕小助手 地址&#x…

【Android开发基础】传感器(方向传感器、加速度传感器)

文章目录 一、引言二、设计1、指南针&#xff08;方向传感器&#xff09;&#xff08;1&#xff09;效果&#xff08;2&#xff09;UI设计&#xff08;3&#xff09;功能设计 2、摇一摇&#xff08;加速度传感器&#xff09;&#xff08;1&#xff09;效果&#xff08;2&#x…

华硕天选2ubuntu18.04升级内核后黑屏

https://piaoyun.cc/post/26957.html 1.开机&#xff0c;进入grub画面 2.按’‘‘e’’’ 进入编辑开机指令的模式,同样找到’‘‘quite splash’’,并在后面加上对应的字。 1.Intel 82852/82855 或8系列显示晶片&#xff1a;i915.modeset1或i915.modeset0 2.Nvidia&#xff…

SpringBoot集成支付宝支付 - 少走弯路就看这篇

最近在做一个网站&#xff0c;后端采用了SpringBoot&#xff0c;需要集成支付宝进行线上支付&#xff0c;在这个过程中研究了大量支付宝的集成资料&#xff0c;也走了一些弯路&#xff0c;现在总结出来&#xff0c;相信你读完也能轻松集成支付宝支付。 在开始集成支付宝支付之前…

【神经网络】梯度检测

在神经网络中&#xff0c;使用前向或者反向传播计算后&#xff0c;再使用梯度下降去寻找代价函数最小时 θ \theta θ的取值是一个可行的方法&#xff0c;但是它很容易出错&#xff1a;因为在这个算法中含有海量的细节&#xff0c;容易产生微小而又难以察觉的bug。即便是存在bu…