84、【栈与队列】leetcode ——1047. 删除字符串中的所有相邻重复项:栈+双指针解法(C++版本)

news2024/10/5 22:23:14

题目描述

在这里插入图片描述
在这里插入图片描述
原题链接:1047. 删除字符串中的所有相邻重复项

解题思路

一、栈顶匹配重复元素

本题需要删除重复且相邻元素,存入不重复元素。根据相邻特点,可采用栈进行实现。

当栈顶元素和遍历的字符串中的字符相同时,则将其弹栈。然后遍历下一个元素,直至全部遍历完,让各个相邻元素都不重复的存入栈中。再将其弹栈存入到子串中,因为栈为后进先出,因此需要让字符串进行逆置,恢复原始顺序。

class Solution {
public:
    string removeDuplicates(string s) {
        stack<char> st;
        string res = "";
        for(char ch : s) {
            // 当栈为空或者栈顶元素与ch不相同,则将ch压入栈中
            if(st.empty() || st.top() != ch) {
                st.push(ch);
            } else {
                // 如果栈中不为空而且栈顶元素与ch相等,则弹出已存入的栈顶元素
                st.pop();
            }
        }
        // 存入res中
        while(!st.empty()) {
            res += st.top();
            st.pop();
        }
        // 因为从栈中弹出的元素为逆序,因此需要将字符串再逆序,让顺序正过来
        reverse(res.begin(), res.end());
        return res;
    }
};

时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( n ) O(n) O(n)

二、双指针方法

初步想法是类似于 移除链表元素 的方式,采用快慢双指针存储符合条件的元素,不存储不符合条件的元素。

此题和移除链表元素题的区别,在于本题需要对比的不仅仅是原始链表中的相邻元素,还需要再与已经存入的元素进行对比。

image.png

设置j指针用来存储符合条件的元素,始终指向待存储位置的下标。设置i指针遍历原字符串,每次首先对比s[i]s[i+1]字符是否相同,如果相同,则需要跳过这两个字符,并剪枝。如果不相同,再对比s[i]s[j - 1]中字符是否相同,如果相同,则让j--,让下一次存储覆盖已存入的元素,并剪枝。

当原始字符串中相邻元素不相同,而且待存入元素与新字符串的末尾元素不相同时,存入该元素。

其实,就相当于是i为pre指针,i+1为cur指针,j为temp指针(用于存入新元素,指向新子串末尾的下一个位置)。每次对比pre指针和cur指针指向元素,然后再对比pre指针和(temp-1)指针对比。

class Solution {
public:
    string removeDuplicates(string s) {          
        int n = s.size();
        // 用j指向新的待存储元素的位置
        int j = 0;
        for(int i = 0; i < n; i++) {
            // 当s[i]与s[i+1]相同时,跳过这两个元素,再剪枝
            if(i + 1 < n && s[i] == s[i + 1]) {
                i++;    // 先加1,之后循环结尾还会再加1,从而实现跳过这两个重复元素
                continue;
            // 当s[i]与s[j - 1]中元素相同时,让此位置元素可被替换,执行j--,并再执行i++跳过该元素,再剪枝
            }else if(j > 0 && s[j - 1] == s[i]) {
                j--;
                continue;
            }
            // 当相邻元素不重复时而且已存入元素和新存入元素不重复时,加入该元素
            s[j++] = s[i];                
        }        
        s.resize(j);
        return s;
    }
};

时间复杂度 O ( n ) O(n) O(n)
空间复杂度 O ( 1 ) O(1) O(1)

参考文章:1047. 删除字符串中的所有相邻重复项

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

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

相关文章

spring内置验证码kaptcha,baomidou使用详解

引入pom <dependency><groupId>com.baomidou</groupId><artifactId>kaptcha-spring-boot-starter</artifactId><version>1.1.0</version></dependency>application.yml 配置 kaptcha:height: 50width: 200content:length: 5s…

【Linux从入门到放弃】Linux编辑器——vim的使用

&#x1f9d1;‍&#x1f4bb;作者&#xff1a; 情话0.0 &#x1f4dd;专栏&#xff1a;《Linux从入门到放弃》 &#x1f466;个人简介&#xff1a;一名双非编程菜鸟&#xff0c;在这里分享自己的编程学习笔记&#xff0c;欢迎大家的指正与点赞&#xff0c;谢谢&#xff01; L…

TPM知识点集锦

1. 实体类型&#xff08;Entity Types&#xff09; &#xff08;1&#xff09;永久实体&#xff08;Permanent Entities&#xff09; 层级&#xff08;Hierarchies&#xff09;字典攻击锁定机制&#xff08;the dictionary attack lockout mechanism&#xff09;平台配置寄存…

Python安装torch(含torch和torchvision对应版本)

torch 、torchvision和python的对应版本如下&#xff1a; torch torchvision pythonmaster / nightlymaster / nightly>3.61.7.1 0.8.2>3.61.7.0 0.8.1>3.61.7.00.8.0>3.61.6.00.7.0>3.61.5.10.6.1>3.51.5.00.6.0>3.51.4.00.5.0 2.7, >3.5, <3.81…

HTC红外发射器基站红灯,死机,恢复出厂固件操作步骤

固件路径&#xff1a;C:\Program Files (x86)\Steam\steamapps\common\SteamVR\tools\lighthouse\firmware\lighthouse_tx\archive\htc_2.0 原厂244固件 找到以下两个文件 lighthouse_tx_htc_2_0-calibration-rescue-244.binlighthouse_tx_htc_2_0-244-2016-03-12.bin 1.在…

Python采集二手房源数据信息 基础版, 多线程版

前言 大家早好、午好、晚好吖 ❤ ~ 环境使用: Python 3.8 Pycharm 模块使用: requests >>> pip install requests 数据请求模块 parsel >>> pip install parsel 数据解析模块 re csv 内置模块 安装python第三方模块: win R 输入 cmd 点击确定, 输入…

基础算法(一)——快速排序

快速排序 介绍 快排是一种复杂度O(nlog(n)nlog(n)nlog(n))的排序算法&#xff0c;在极端情况下会退化为O(n2{n}^2n2)&#xff0c;但是它是一种原地算法&#xff0c;即不需要占据额外空间 原理是先在数列中取一个数x&#xff0c;这个数一般随机选取或是取中间值&#xff0c;然…

四、k8s实战入门

本章节将介绍如何在kubernetes集群中部署一个nginx服务&#xff0c;并且能够对其进行访问。 1 namespace Namespace是kubernetes系统中的一种非常重要资源&#xff0c;它的主要作用是用来实现多套环境的资源隔离或者多租户的资源隔离。 默认情况下&#xff0c;kubernetes集群…

VuePress搭建文档网站遇到的一些坑点,中文路径,图片显示失败,打包白屏

VuePress搭建文档网站遇到的一些坑点 前言 本篇记录用VuePress搭建文档网站时碰到的一些坑点和解决方案 ★提高阅读体验★ &#x1f449; ♠一级标题 &#x1f448; &#x1f449; ♥二级标题 &#x1f448; &#x1f449; ♥ 三级标题 &#x1f448; &#x1f449; ♥…

HTML与CSS基础(六)—— CSS布局(浮动float)

目标能够使用 结构伪类选择器 在HTML中选择元素 能够说出 标准流 元素的布局特点 能够说出 浮动元素 的特点 能够使用浮动完成 小米模块布局案例 能够说出 清除浮动 的目的&#xff0c;并能够使用 清除浮动的方法一、结构伪类选择器目标&#xff1a;能够使用 结构伪类选择器 在…

MemPrompt: Memory-assisted Prompt Editing with User Feedback

Paper name MemPrompt: Memory-assisted Prompt Editing with User Feedback Paper Reading Note URL: https://arxiv.org/pdf/2201.06009.pdf TL;DR ACL 2022 Workshop CSRR 文章&#xff0c;MemPrompt 将用户对模型预测错误的反馈保存下来&#xff0c;之后遇到类似的问题…

CesiumLab安装、CesiumLab账号注册以及不同授权类型的说明 CesiumLab系列教程

下载软件并安装 官方下载地址&#xff1a;http://cesiumlab.com/#/update 双击 exe 安装。 CesiumLab安装包 CesiumLab安装过程 CesiumLab需要的依赖环境 安装过程会提示 本程序依赖 VC2019 实时运行库&#xff0c;如本机已安装了 VC2019 实时运行库&#xff0c;可以点击【取…

【STM32笔记】HAL库Flash读写配置

【STM32笔记】HAL库Flash读写配置 在keil里面的默认工程配置中 Flash分配地址 程序部分为0x0800 0000到0x0810 0000 总共是0x0010 0000的大小 也就是1048576Byte 1024KB 1MB 而实际上程序部分大小应该要看硬件手册来确定 可以通过配置keil工程中size的大小 来确定程序地址的范…

实验二十七 IPSec配置

实验二十七 IPSec配置实验目的&#xff1a; 某公司由总部和分支机构构成&#xff0c;通过IPsec实验网络安全&#xff0c;保证总部和分支机构的局域 网安全通信。网络拓扑图&#xff1a;IPSec(IP Security)是IETF定义的一组协议&#xff0c;用于增强IP网络的安全性 。 IPsec的功…

【深度学习】李宏毅2021/2022春深度学习课程笔记 - Anomaly Detection(异常侦测)

文章目录一、Problem Formulation二、What is Anomaly&#xff1f;三、Applications四、Binary Classification&#xff1f;五、Categories六、Case 1&#xff1a;With Classifier七、Case 2&#xff1a;Without Labels八、Use Auto-Encoder九、More一、Problem Formulation 假…

Java之反射机制

反射机制 引出反射 我们的猫类 传统的方式 就是new 然后通过对象调用呗 用properties做的话&#xff0c;首先肯定是获取信息 读取配置文件的信息 然后我们需要创建对象是吧 但是这个时候 new classfullpath是不行的&#xff0c;因为我们实际上需要的是 类名 而不是字符串&…

2023年1月7日:fastadmin导出数据为excel格式

需求图&#xff1a; 实现方法&#xff1a; 第一种方法&#xff1a;fastadmin自带导出数据&#xff0c;直接点击下载即可 效果图第二种方法&#xff1a;自定义导出按钮&#xff0c;需要编写方法 效果图&#xff1a; 效果图代码实现 首先&#xff1a;前端按钮代码(可直接拿来用…

【HCIA-openEuler】实验手册—01【openEuler操作系统安装】

文章目录一、实验介绍1、关于本实验2、实验目的3、实验所需材料二、配置虚拟化环境步骤1&#xff1a;硬件准备步骤2&#xff1a;软件准备三、安装openEuler操作系统1、创建虚拟机步骤1&#xff1a;新建虚拟机步骤2&#xff1a;向导选择典型(推荐)步骤3&#xff1a;选择镜像文件…

MonoScene: Monocular 3D Semantic Scene Completion

Paper name MonoScene: Monocular 3D Semantic Scene Completion Paper Reading Note URL: https://arxiv.org/pdf/2112.00726.pdf TL;DR 2022 cvpr 论文&#xff0c;提出一种能在室内与室外场景均可使用的单目 SSC 方案&#xff0c;与特斯拉的 Occupancy Network 非常相似…

【Java基础】day12

一、Redis 的缓存穿透、缓存击穿、缓存雪崩是什么&#xff1f; 缓存穿透 请求不存在【 DB 和 Redis 中都不存在】的数据&#xff0c;导致请求直接打到持久层数据库中&#xff0c;导致数据库负载过高&#xff0c;甚至导致宕机。这样的请求几乎可以导致请求次次到达 DB &#xff…