跟着Carl大佬学leetcode之844 比较含退格的字符串

news2025/7/7 4:26:02

来点强调,刷题是按照代码随想录的顺序进行的,链接如下https://www.programmercarl.com/本系列是记录一些刷题心得和学习过程,就看到题目自己先上手试试,然后看程序员Carl大佬的解释,自己再敲一遍修修补补,练题的小伙伴还是跟着大佬的解释比较系统

文章目录

  • 每日碎碎念
  • 一、题目要求及测试点
    • 844 比较含退格的字符串
    • 测试点
    • 提示
  • 二、题解
    • 自己上手
    • 正经题解
      • 二分法之用栈处理遍历
      • 二分法之逆序双指针法
  • 三、总结


每日碎碎念

苦痛生活继续
hello LeetCode,今天还是数组查找元素专项刷题…


一、题目要求及测试点

844 比较含退格的字符串

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

注意:如果对空文本输入退格字符,文本继续为空。
链接https://leetcode.cn/problems/backspace-string-compare/description/

测试点

示例 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"。

示例4:

输入:s = "y#fo##f", t = "y#f#o##f"
输出:true

提示

  1. 1 <= s.length, t.length <= 200
  2. s 和 t 只含有小写字母以及字符 ‘#’

二、题解

自己上手

代码如下:

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        int slowIndex1 = 0;
        int fastIndex = 0;
        for (; fastIndex < s.size(); fastIndex++) {
            if (s[fastIndex] == '#' && slowIndex1 != 0)
                slowIndex1--;
            else if (s[fastIndex] != '#')
                s[slowIndex1++] = s[fastIndex];
        }
        if (slowIndex1 <= 0) {
            slowIndex1 = 0;
            s = "";
        }
        int slowIndex2 = 0;
        for (fastIndex = 0; fastIndex < t.size(); fastIndex++) {
            if (t[fastIndex] == '#' && slowIndex2 != 0)
                slowIndex2--;
            else if (t[fastIndex] != '#')
                t[slowIndex2++] = t[fastIndex];
        }
        if (slowIndex2 <= 0) {
            slowIndex2 = 0;
            t = "";
        }
        // printf("%d %d\n", slowIndex1,slowIndex2);
        // printf("%s %s", s.c_str(), t.c_str());
        if (slowIndex1 != slowIndex2)
            return false;
        else {
            for (int i = 0; i < slowIndex1; i++) {
                if (s[i] != t[i])
                    return false;
            }
        }
        return true;
    }
};

在这里插入图片描述

来点无用总结:
时间复杂度O(n),空间复杂度O(1),被示例4卡了下,后发现是用的else没用else if,准确是对fastIndex是否为#做区分;
对两个字符串都进行退格操作,然后slow就是退格后字符串长,中间注意对空字符串退格无效的情况…总结着发现有段判定是无用的

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        int slowIndex1 = 0;
        int fastIndex = 0;
        for (; fastIndex < s.size(); fastIndex++) {
            if (s[fastIndex] == '#' && slowIndex1 != 0)
                slowIndex1--;
            else if (s[fastIndex] != '#')
                s[slowIndex1++] = s[fastIndex];
        }
        int slowIndex2 = 0;
        for (fastIndex = 0; fastIndex < t.size(); fastIndex++) {
            if (t[fastIndex] == '#' && slowIndex2 != 0)
                slowIndex2--;
            else if (t[fastIndex] != '#')
                t[slowIndex2++] = t[fastIndex];
        }
        if (slowIndex1 != slowIndex2)
            return false;
        else {
            for (int i = 0; i < slowIndex1; i++) {
                if (s[i] != t[i])
                    return false;
            }
        }
        return true;
    }
};

在这里插入图片描述

正经题解

两个思路,一是用栈处理遍历,二是逆序双指针法

二分法之用栈处理遍历

重构字符串,思路和我一致,只是因为这种删除退格很类似删除栈底操作…
for (char ch : x) 等价于 for (int i=0; i< x.length(); i++){ char ch = x[i] …}
如果ch是普通字符,那么我们将其压入栈中
如果ch是退格符,那么我们将栈顶弹出;

class Solution {
public:
    bool backspaceCompare(string s, string t) {
        return (judge(s) == judge(t)); 
    }

    string judge(string x){ 
        string res;//存退格后结果
        for (char ch : x){ 
            if (ch != '#')
                res.push_back(ch); 
            else if (!res.empty())
                res.pop_back(); 
        }
        return res; 
    }
};

时间复杂度:O(N+M),空间复杂度:O(N+M),其中 N 和 M 分别为字符串 s 和 t 的长度。主要为还原出的字符串的开销。

二分法之逆序双指针法

https://leetcode.cn/problems/backspace-string-compare/solutions/451606/bi-jiao-han-tui-ge-de-zi-fu-chuan-by-leetcode-solu/
力扣题解
来源力扣题解截图
时间复杂度:O(N+M),空间复杂度:O(1)


三、总结

1.C++ 中 printf输出string字符串不能直接printf(“%s”,str),可以借助str.c_str()函数对字符串str进行转换printf(“%s\n”,x.c_str()),再输出。
2.str.popback(),str.push_back,str.empty()操作熟悉下…

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

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

相关文章

IDM的实用功能介绍+下载地址

下载地址 &#xff1a; 下载到idm 互联网下载管理器&#xff08;IDM&#xff09;实用功能概述 1. 多线程下载 IDM使用多线程技术&#xff0c;将文件分割成多个部分同时下载&#xff0c;显著提高下载速度。 2. 计划任务 用户可以设定下载任务的开始时间&#xff0c;甚至在特…

SSDReporter for Mac:全面检测SSD健康,预防数据丢失,让您的Mac运行更稳定

SSDReporter for Mac是一款专为Mac用户设计的固态硬盘&#xff08;SSD&#xff09;健康状况检测工具&#xff0c;旨在帮助用户全面了解并监控其Mac设备中SSD的工作状态&#xff0c;从而确保数据的完整性和设备的稳定性。 这款软件具有多种强大的功能。首先&#xff0c;它能够定…

DevOps流程的简单总结

DevOps流程图&#xff1a; DevOps流程包含&#xff1a;计划&#xff08;plan&#xff09;、编码(code)、编译(build)、测试(test)、发布(release)、部署(deploy)、运营(operate)、监控&#xff08;monitor&#xff09;&#xff0c;这是一个循环的过程。DevOps是依托容器、自动化…

数据赋能(62)——要求:数据管理部门能力

“要求&#xff1a;数据管理部门能力”是作为标准的参考内容编写的。 在实施数据赋能中&#xff0c;数据管理部门的能力体现在多个方面&#xff0c;关键能力如下图所示。 在实施数据赋能的过程中&#xff0c;数据管理部门应具备的关键能力如下。 数据治理与标准化能力 数据管…

python爬虫-----深入了解 requests 库(第二十五天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

C#控制台相关方法

控制台相关方法 文章目录 控制台输入1、清空2、设置控制台3、设置光标位置&#xff0c;1y 2x4、设置颜色相关5、光标显隐6、关闭控制台思考 移动方块 控制台输入 //如果ReadKey(true)不会把输入的内容显示再控制台上 char c Console.ReadKey(true).KeyChar;1、清空 ​ Cons…

Golang | Leetcode Golang题解之第40题组合总和II

题目&#xff1a; 题解&#xff1a; func combinationSum2(candidates []int, target int) (ans [][]int) {sort.Ints(candidates)var freq [][2]intfor _, num : range candidates {if freq nil || num ! freq[len(freq)-1][0] {freq append(freq, [2]int{num, 1})} else {…

免费高效无广告!开源的跨平台文件下载器:FileCentipede

FileCentipede&#xff1a;高速、全能、零广告的开源跨平台下载神器&#xff0c;汇聚多种协议&#xff0c;为您带来前所未有的免费下载体验&#xff01;- 精选真开源&#xff0c;释放新价值。 概览 在这个数字数据几乎构成一切的时代&#xff0c;从最终用户的角度来看&#xf…

2.4 Web容器配置:Tomcat

2.4 Web容器配置 2.4.1Tomcat配置1.常规配置2. HTTPS配置 *********** 2.4.1Tomcat配置 1.常规配置 在SpringBoot项目中&#xff0c;可以内置Tomcat、Jetly、Undertow、Netty等容器。 当开发者添加了spring-boot-starter-web依赖之后&#xff0c;默认会使用Tomcat作为Web容器…

微软 SDL 安全研发生命周期详解

微软SDL&#xff08;Security Development Lifecycle&#xff09;是一种安全软件开发的方法论&#xff0c;它强调在整个产品开发过程中融入安全考虑因素。SDL 是一个动态的过程&#xff0c;包括多个阶段和活动&#xff0c;以确保产品的安全开发、测试、部署和运行。Microsoft 要…

深入理解数据结构第五弹——排序(2)——快速排序

排序&#xff08;1&#xff09;&#xff1a;深入了解数据结构第四弹——排序&#xff08;1&#xff09;——插入排序和希尔排序-CSDN博客 前言&#xff1a; 在前面我们已经讲过了几种排序方式&#xff0c;他们的效率有快有慢&#xff0c;今天我们来学习一种非常高效的排序方式…

小程序AI智能名片S2B2C商城系统:做内容、造IP、玩社群打造私域流量的新营销秘籍

在数字化浪潮汹涌的新时代&#xff0c;小程序AI智能名片S2B2C商城系统正以其独特的魅力&#xff0c;引领着营销领域的新变革。这套系统不仅将人工智能与小程序技术完美结合&#xff0c;更通过创新的S2B2C模式&#xff0c;为企业打开了一扇通往成功的大门。 面对激烈的市场竞争&…

【uniapp】 合成海报组件

之前公司的同事写过一个微信小程序用的 合成海报的组件 非常十分好用 最近的项目是uni的 把组件改造一下也可以用 记录一下 <template><view><canvas type"2d" class"_mycanvas" id"my-canvas" canvas-id"my-canvas" …

设计模式——访问者模式22

访问者模式能将算法与其所作用的对象隔离开来&#xff0c;分离数据结构与访问数据操作。例如 不同访问者 对不同 文件类型&#xff08;要素&#xff09;的操作权限不同。 设计模式&#xff0c;一定要敲代码理解 元素抽象&#xff08;被访问的元素&#xff09; accept 方法实…

【数据结构】单链表的头节点与尾节点

&#x1f388;个人主页&#xff1a;豌豆射手^ &#x1f389;欢迎 &#x1f44d;点赞✍评论⭐收藏 &#x1f917;收录专栏&#xff1a;数据结构 &#x1f91d;希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出指正&#xff0c;让我们共同学习、交流进…

Appian发布最新版本:通过AI流程自动化推动业务发展

Appian公司于2024年4月16日在弗吉尼亚州麦克莱恩宣布推出Appian平台的最新版本。此版本引入了Process HQ&#xff0c;这是一个集流程挖掘和企业AI于一体的系统&#xff0c;结合了Appian的数据平台。Process HQ为企业运营提供前所未有的可见性&#xff0c;支持数据驱动的决策和流…

nas如何异地共享文件?

nas异地共享文件是一种通过网络实现不同地区电脑与电脑、设备与设备、电脑与设备之间的文件共享的技术。通过nas&#xff08;网络附加存储&#xff09;设备&#xff0c;用户可以在不同地点的电脑或设备之间快速、安全地共享文件和数据。本文将介绍nas异地共享文件的原理以及它在…

宝塔面板使用docker+nginx+gunicorn部署Django项目实战教程

第一步&#xff1a;创建Django项目 使用pip install django安装创建django项目的依赖在电脑某个根目录下执行django-admin startproject app创建一个名为app的Django项目。目录结构如下: ├── app │ ├── init.py │ ├── asgi.py │ ├── settings.py │ ├── url…

SQL注入作业

目录 一、万能密码和二阶注入测试 1.万能密码 2.二阶注入测试 二、联合查询注入测试 1.判断注入点 2.判断当前查询语句的列数 3.查询数据库基本信息 4.查询数据库中的数据 三、报错注入 1. 报错注入函数EXTRATVALUE 2.UPDATEXML 四、盲注测试 1.布尔盲注 判断数据…

【学习】软件压力测试对软件产品的作用

在信息化高速发展的今天&#xff0c;软件产品已经成为各行各业不可或缺的一部分。然而&#xff0c;随着软件功能的日益复杂和用户需求的不断增长&#xff0c;软件产品的稳定性和可靠性问题也愈发凸显。在这样的背景下&#xff0c;软件压力测试作为软件质量保障的重要手段之一&a…