算法沉淀——栈(leetcode真题剖析)

在这里插入图片描述

算法沉淀——栈

  • 01.删除字符串中的所有相邻重复项
  • 02.比较含退格的字符串
  • 03.基本计算器 II
  • 04.字符串解码
  • 05.验证栈序列

栈(Stack)是一种基于先进后出(Last In, First Out,LIFO)原则的数据结构。栈具有两个主要的操作:

  1. 压栈(Push):将元素添加到栈的顶部。
  2. 出栈(Pop):从栈的顶部移除元素。

栈常常用于需要反转操作顺序的场景,或者在需要记录操作历史的情况下。在算法中,栈的应用广泛,以下是一些典型的栈算法:

  1. 括号匹配问题:使用栈来检查表达式中的括号是否匹配,例如检查 ()[]{} 是否正确嵌套。
  2. 逆波兰表达式求值:通过栈来实现对逆波兰表达式的求值,其中操作数和操作符都存储在栈中。
  3. 函数调用栈:在编程语言中,函数调用时的执行过程通常使用函数调用栈(Call Stack)来管理。
  4. 深度优先搜索(DFS):在图或树的遍历过程中,使用栈来实现深度优先搜索。
  5. 迭代法求解二叉树的前序、中序、后序遍历:通过栈来模拟递归过程,实现二叉树的不同遍历方式。
  6. 表达式求值:将中缀表达式转换为后缀表达式,然后使用栈求解后缀表达式的值。
  7. 迷宫求解:通过栈来记录路径,实现对迷宫的求解过程。

栈的特性使其在某些问题场景中非常有效和方便。在算法设计和实现中,栈通常用于临时存储数据、回溯操作、深度优先搜索等。

01.删除字符串中的所有相邻重复项

题目链接:https://leetcode.cn/problems/remove-all-adjacent-duplicates-in-string/

给出由小写字母组成的字符串 S重复项删除操作会选择两个相邻且相同的字母,并删除它们。

在 S 上反复执行重复项删除操作,直到无法继续删除。

在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。

示例:

输入:"abbaca"
输出:"ca"
解释:
例如,在 "abbaca" 中,我们可以删除 "bb" 由于两字母相邻且相同,这是此时唯一可以执行删除操作的重复项。之后我们得到字符串 "aaca",其中又只有 "aa" 可以执行重复项删除操作,所以最后的字符串为 "ca"。

提示:

  1. 1 <= S.length <= 20000
  2. S 仅由小写英文字母组成。

思路

这里使用栈的思想可以很好的解决这个问题,我们每插入一个字符前进行对比,如果栈顶存在该字符,则删除栈顶字符且不插入,否则插入字符,最后留在栈中的字符就是需要返回的,考虑到字符顺序的问题,我们可以直接用字符串来直接模拟栈。

代码

class Solution {
public:string removeDuplicates(string s) {string ret;for(int i=0;i<s.size();++i){if(ret.size()&&s[i]==ret.back()) ret.pop_back();else ret+=s[i];}return ret;}
};

02.比较含退格的字符串

题目链接:https://leetcode.cn/problems/backspace-string-compare/

给定 st 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 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 只含有小写字母以及字符 '#'

思路

同样我们使用栈的思想,分别使用两个空字符串来模拟栈,遇到#字符就出栈,其他时候进栈,最后比较两个字符串即可。

代码

class Solution {
public:bool backspaceCompare(string s, string t) {string s1,s2;for(int i=0;i<s.size();++i){if(s[i]=='#') {    if(s1.size()) s1.pop_back();}else s1+=s[i];}for(int i=0;i<t.size();++i){      if(t[i]=='#') {    if(s2.size()) s2.pop_back();}else s2+=t[i];}return s1==s2;}
};

03.基本计算器 II

题目链接:https://leetcode.cn/problems/basic-calculator-ii

给你一个字符串表达式 s ,请你实现一个基本计算器来计算并返回它的值。

整数除法仅保留整数部分。

你可以假设给定的表达式总是有效的。所有中间结果将在 [-231, 231 - 1] 的范围内。

**注意:**不允许使用任何将字符串作为数学表达式计算的内置函数,比如 eval()

示例 1:

输入:s = "3+2*2"
输出:7

示例 2:

输入:s = " 3/2 "
输出:1

示例 3:

输入:s = " 3+5 / 2 "
输出:5

提示:

  • 1 <= s.length <= 3 * 105
  • s 由整数和算符 ('+', '-', '*', '/') 组成,中间由一些空格隔开
  • s 表示一个 有效表达式
  • 表达式中的所有整数都是非负整数,且在范围 [0, 231 - 1]
  • 题目数据保证答案是一个 32-bit 整数

思路

根据题目要求我们只需要考虑空格、数字和四个运算符这几种情况,我们可以使用一个数组来模拟栈插入每一个数,使用一个前缀字符来进行运算符的标记,初始设为加,当我们碰到加减都更新,碰到乘除就直接在栈顶计算,直至字符串结束,最后我们将栈中的数相加即可。

代码

class Solution {
public:int calculate(string s) {vector<int> st;char op='+';int n=s.size(),i=0,ret=0;while(i<n){if(s[i]==' ') i++;else if(s[i]>='0'&&s[i]<='9'){int tmp=0;while(i<n&&s[i]>='0'&&s[i]<='9') tmp=tmp*10+(s[i++]-'0');if(op=='+') st.push_back(tmp);else if(op=='-') st.push_back(-tmp);else if(op=='*') st.back() *=tmp;else if(op=='/') st.back() /=tmp;}else op=s[i++];}for(int& i:st) ret+=i;return ret;}
};

04.字符串解码

题目链接:https://leetcode.cn/problems/decode-string/

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a2[4] 的输入。

示例 1:

输入:s = "3[a]2[bc]"
输出:"aaabcbc"

示例 2:

输入:s = "3[a2[c]]"
输出:"accaccacc"

示例 3:

输入:s = "2[abc]3[cd]ef"
输出:"abcabccdcdcdef"

示例 4:

输入:s = "abc3[cd]xyz"
输出:"abccdcdcdxyz"

提示:

  • 1 <= s.length <= 30
  • s 由小写英文字母、数字和方括号 '[]' 组成
  • s 保证是一个 有效 的输入。
  • s 中所有整数的取值范围为 [1, 300]

思路

这里我们要使用栈来解决问题,我们需要模拟每一种情况的发生,以及细节的处理,我们建立一个重复数的栈和一个字符串的栈,遇到数字,放入数字栈中,遇到左括号,把后面的字符串提取出来,放入字符串栈中,遇到了右括号,解析然后放到字符串栈顶字符串之后,遇到单独字符放到字符串栈顶字符串之后,最后栈顶的字符串即为我们需要的字符串。

代码

class Solution {
public:string decodeString(string s) {// 使用两个栈,一个用于存储字符串,另一个用于存储数字stack<string> st;stack<int> nums;// 初始化栈,将一个空字符串入栈,用于存储当前解码的结果st.push("");int i = 0, n = s.size();// 遍历输入字符串while (i < n) {// 如果当前字符是数字,解析数字并入数字栈if (s[i] >= '0' && s[i] <= '9') {int tmp = 0;while (s[i] >= '0' && s[i] <= '9') tmp = tmp * 10 + (s[i++] - '0');nums.push(tmp);}// 如果当前字符是'[',入栈一个空字符串,用于存储当前括号内的解码结果else if (s[i] == '[') {i++;string tmp;while (s[i] >= 'a' && s[i] <= 'z') tmp += s[i++];st.push(tmp);}// 如果当前字符是']',将栈顶字符串重复相应次数后,与前一个栈顶字符串拼接else if (s[i] == ']') {string tmp = st.top();st.pop();int k = nums.top();nums.pop();while (k--) st.top() += tmp;i++;}// 如果当前字符是字母,将字母拼接到栈顶字符串else {string tmp;while (i < n && s[i] >= 'a' && s[i] <= 'z') tmp += s[i++];st.top() += tmp;}}// 最终栈中存储的即为解码结果return st.top();}
};

05.验证栈序列

题目链接:https://leetcode.cn/problems/validate-stack-sequences/

给定 pushedpopped 两个序列,每个序列中的 值都不重复,只有当它们可能是在最初空栈上进行的推入 push 和弹出 pop 操作序列的结果时,返回 true;否则,返回 false

示例 1:

输入:pushed = [1,2,3,4,5], popped = [4,5,3,2,1]
输出:true
解释:我们可以按以下顺序执行:
push(1), push(2), push(3), push(4), pop() -> 4,
push(5), pop() -> 5, pop() -> 3, pop() -> 2, pop() -> 1

示例 2:

输入:pushed = [1,2,3,4,5], popped = [4,3,5,1,2]
输出:false
解释:1 不能在 2 之前弹出。

提示:

  • 1 <= pushed.length <= 1000
  • 0 <= pushed[i] <= 1000
  • pushed 的所有元素 互不相同
  • popped.length == pushed.length
  • poppedpushed 的一个排列

思路

这里我们可以直接用一个栈来模拟这个过程,当栈为空则说明相匹配,否则就说明不匹配

代码

class Solution {
public:bool validateStackSequences(vector<int>& pushed, vector<int>& popped) {stack<int> st;int i=0,n=popped.size();for(int& x:pushed){st.push(x);while(!st.empty()&&st.top()==popped[i]){st.pop();i++;}}return st.empty();}
};

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

宿舍报修|宿舍报修小程序|基于微信小程序的宿舍报修系统的设计与实现(源码+数据库+文档)

宿舍报修小程序目录 目录 基于微信小程序的宿舍报修系统的设计与实现 一、前言 二、系统功能设计 三、系统实现 1、学生信息管理 2 维修人员管理 3、故障上报管理 4、论坛信息管理 四、数据库设计 1、实体ER图 五、核心代码 六、论文参考 七、最新计算机毕设选题推…

算法学习——LeetCode力扣贪心篇1

算法学习——LeetCode力扣贪心篇1 455. 分发饼干 455. 分发饼干 - 力扣&#xff08;LeetCode&#xff09; 描述 假设你是一位很棒的家长&#xff0c;想要给你的孩子们一些小饼干。但是&#xff0c;每个孩子最多只能给一块饼干。 对每个孩子 i&#xff0c;都有一个胃口值 g[…

蓝桥杯电子类单片机提升一——超声波测距

前言 单片机资源数据包_2023 一、超声波测距原理 二、超声波测距的应用 1.超声波的发射 2.单片机知识补充&#xff1a;定时器 3.超声波的接收与计时 4.距离的计算 1&#xff09;定时器1为16位自动重载&#xff0b;1T11.0592MHz 2&#xff09;定时器1为16位自动重载&am…

vscode运行C/C++时候cmd.exe界面显示

写了一些命令行传参的程序&#xff0c;需要终端输入参数&#xff0c;默认是输出结果显示在它自己的终端界面 Code-runner: Run In Terminal 打勾就行 效果&#xff1a;

从0开始图形学(光栅化)

前言 说起图形学&#xff0c;很多人就会提到OpenGL&#xff0c;但其实两者并不是同一个东西。引入了OpenGL加重了学习的难度和成本&#xff0c;使得一些原理并不直观。可能你知道向量&#xff0c;矩阵&#xff0c;纹理&#xff0c;重心坐标等概念&#xff0c;但就是不知道这些概…

树莓派4B(Raspberry Pi 4B)使用docker搭建阿里巴巴sentinel服务

树莓派4B&#xff08;Raspberry Pi 4B&#xff09;使用docker搭建阿里巴巴sentinel服务 由于国内访问不了docker hub&#xff0c;而国内镜像仓库又没有适配树莓派ARM架构的sentinel镜像&#xff0c;所以我们只能退而求其次——自己动手构建镜像。本文基于Ubuntu&#xff0c;Jav…

基于centos的Linux中如何安装python

前言 之前在linux上安装python的时候没来及记录下来&#xff0c;感觉还是有必要的&#xff0c;所以现在打算把原来装好的python卸载掉&#xff0c;然后重装一遍&#xff0c;重新记录一下。当前环境是否安装python 通过查询我发现机器里有3个版本的python&#xff0c;第一个是…

【教程】Kotlin语言学习笔记(二)——数据类型(持续更新)

写在前面&#xff1a; 如果文章对你有帮助&#xff0c;记得点赞关注加收藏一波&#xff0c;利于以后需要的时候复习&#xff0c;多谢支持&#xff01; 【Kotlin语言学习】系列文章 第一章 《认识Kotlin》 第二章 《数据类型》 文章目录 【Kotlin语言学习】系列文章一、基本数据…

每日OJ题_递归②_力扣21. 合并两个有序链表

目录 力扣21. 合并两个有序链表 解析代码 力扣21. 合并两个有序链表 21. 合并两个有序链表 难度 简单 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1&#xff1a; 输入&#xff1a;l1 [1,2,4], l2 [1,3,4]…

Spring Boot 笔记 005 环境搭建

1.1 创建数据库和表&#xff08;略&#xff09; 2.1 创建Maven工程 2.2 补齐resource文件夹和application.yml文件 2.3 porn.xml中引入web,mybatis,mysql等依赖 2.3.1 引入springboot parent 2.3.2 删除junit 依赖--不能删&#xff0c;删了会报错 2.3.3 引入spring web依赖…

最新wordpress外贸主题

日用百货wordpress外贸主题 蓝色大气的wordpress外贸主题&#xff0c;适合做日用百货的外贸公司搭建跨境电商网站使用。 https://www.jianzhanpress.com/?p5248 添加剂wordpress外贸建站主题 橙色wordpress外贸建站主题&#xff0c;适合做食品添加剂或化工添加剂的外贸公司…

鸿蒙开发理论之页面和自定义组件生命周期

1、自定义组件和页面的关系 页面&#xff1a;即应用的UI页面。可以由一个或者多个自定义组件组成&#xff0c;Entry装饰的自定义组件为页面的入口组件&#xff0c;即页面的根节点&#xff0c;一个页面有且仅能有一个Entry。只有被Entry装饰的组件才可以调用页面的生命周期。自…

2024-02-08(Flume)

1.Flume 的架构和MQ消息队列有点类似 2.Flume也可以做数据的持久化操作 在Channel部分选择使用File channel组件 3.Flume进行日志文件监控 场景&#xff1a;企业中应用程序部署后会将日志写入到文件中&#xff0c;我们可以使用Flume从各个日志文件将日志收集到日志中心以便…

全面理解JVM虚拟机

为什么要学JVM&#xff1f; ​ 首先&#xff1a;面试需要。面试题层出不穷&#xff0c;难道每次面试都靠背几百上千条面试八股&#xff1f; ​ 其次&#xff1a;基础决定上层建筑。自己写的代码都不知道是怎么回事&#xff0c;怎么可能写出靠谱的系统&#xff1f; ​ 然后&a…

cron表达式介绍和使用

Cron表达式是一种用于配置定时任务的字符串&#xff0c;它由数字、字符和符号组成&#xff0c;用于指定任务在某个时间点或周期性地执行。其通常包含六个或七个字段&#xff0c;每个字段代表一个时间单位&#xff0c;如下表所示&#xff1a; 域必须取值范围特殊字符秒是[0, 59…

探索微信小程序的奇妙世界:从入门到进阶

文章目录 一、什么是微信小程序1.1 简要介绍微信小程序的定义和特点1.2 解释小程序与传统应用程序的区别 二、小程序的基础知识2.1 微信小程序的架构2.2 微信小程序生命周期的理解2.3 探索小程序的目录结构和文件类型 三、小程序框架和组件3.1 深入了解小程序框架的核心概念和原…

Qt之条件变量QWaitCondition详解

QWaitCondition内部实现结构图&#xff1a; 相关系列文章 C之Pimpl惯用法 目录 1.简介 2.示例 2.1.全局配置 2.2.生产者Producer 2.3.消费者Consumer 2.4.测试例子 3.原理分析 3.1.辅助函数CreateEvent 3.2.辅助函数WaitForSingleObject 3.3.QWaitConditionEvent …

服务降级(Sentinel)

服务降级 采用 SentinelResource 注解方式实现&#xff0c; 必要的 依赖必须引入 以及 切面Bean 接口代码 RequestMapping("/degrade")SentinelResource(value DEGRADE_RESOURCE_NAME, blockHandler "blockHandlerForDegrade",entryType EntryType.IN…

数学实验第三版(主编:李继成 赵小艳)课后练习答案(十)(2)(3)

实验十&#xff1a;非线性函数极值求解 练习二 1.求解极值问题: (1) s.t. function [c,ceq]fun(x) c(1)-(25-x(1)^2-x(2)^2); c(2)-(7-x(1)^2x(2)^2); ceq0;换一个窗口运行下面的程序&#xff1a; clc;clear; f(x)-2*x(1)-x(2); a[]; b[]; aeq[];beq[]; u[5;10]; l[0;0];…

Spring Cloud Hystrix 参数配置、简单使用、DashBoard

Spring Cloud Hystrix 文章目录 Spring Cloud Hystrix一、Hystrix 服务降级二、Hystrix使用示例三、OpenFeign Hystrix四、Hystrix参数HystrixCommand.Setter核心参数Command PropertiesFallback降级配置Circuit Breaker 熔断器配置Metrix 健康统计配置Request Context 相关参数…