代码随想录刷题-栈与队列-有效的括号

news/2024/11/30 1:35:21/

文章目录

    • 有效的括号
      • 习题
      • 我的解法
      • 代码随想录解法

有效的括号

本节对应代码随想录中:代码随想录,对应视频链接为:栈的拿手好戏!| LeetCode:20. 有效的括号_哔哩哔哩_bilibili

习题

题目链接:20. 有效的括号 - 力扣(LeetCode)

给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。
  • 每个右括号都有一个对应的相同类型的左括号。
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false

我的解法

首先,如果字符串的位数为奇数,那一定不能全部配对。括号匹配问题,如果学过数据结构就知道这是典型的用栈来解决的问题。

遍历字符串,当前元素若和栈顶元素配成一对,那就弹出栈顶元素。如果最后栈为空,说明全部匹配,若不为空,则不能全部匹配。

问题在于一对括号,如"(“与”)",这两个是不相等的元素。没法简单的直接用相等判断一对括号。

但是观察三对括号的 ASCII 会发现:()分别为40和41;{}分别为123和125、[]分别为91和93。相信你已经看出规律了,右边的数值要比左边的大1或者大2,这样就可以用差值来判断是否为一对

注意题目中明确说了字符串只含有那三对括号中的元素,因此可以用差值来判断

class Solution {public:bool isValid(string s) {if (s.size() % 2 != 0) {return false;}stack<int> myStack;for (int i = 0; i < s.size(); i++) {int tmp = myStack.empty() ? 0 : s[i] - myStack.top();// 差值为1或者为2说明为一对if (tmp == 1 || tmp == 2) {myStack.pop();  // 弹出来栈中已匹配的左符号} else {myStack.push(s[i]);  // 不匹配则push当前元素}}return myStack.empty();}
};
  • 时间复杂度:O( n n n)。其中 n 是字符串 s 的长度
  • 空间复杂度:O( n n n)。需要使用一个栈存储字符串的元素,其中 n 是字符串 s 的长度

代码随想录解法

我的解法中是用差值来判断是否为一对,而代码随想录是用多个 if 来判断各种情况。相比而言,我的代码更加简洁,不用写很多个 if 判断多种情况,但是代码随想录的效率更加高一点。原因在于我的解法必须遍历完全部元素才能返回结果,而代码随想录在遍历的过程中就可能得到结果。

具体来说,每次遇到左括号,将对应的右括号入栈。这样之后遇到遇到右括号就可以判断栈顶的元素是否等于当前右括号进行判断,如果不等或者栈已经空了,则返回 false。

class Solution {
public:bool isValid(string s) {if (s.size() % 2 != 0) return false; // 如果s的长度为奇数,一定不符合要求stack<char> st;for (int i = 0; i < s.size(); i++) {if (s[i] == '(') st.push(')');else if (s[i] == '{') st.push('}');else if (s[i] == '[') st.push(']');// 第三种情况:遍历字符串匹配的过程中,栈已经为空了,没有匹配的字符了,说明右括号没有找到对应的左括号 return false// 第二种情况:遍历字符串匹配的过程中,发现栈里没有我们要匹配的字符。所以return falseelse if (st.empty() || st.top() != s[i]) return false;else st.pop(); // st.top() 与 s[i]相等,栈弹出元素}// 第一种情况:此时我们已经遍历完了字符串,但是栈不为空,说明有相应的左括号没有右括号来匹配,所以return false,否则就return truereturn st.empty();}
};
  • 时间复杂度:O( n n n)。其中 n 是字符串 s 的长度
  • 空间复杂度:O( n n n)。需要使用一个栈存储字符串的元素,其中 n 是字符串 s 的长度

http://www.ppmy.cn/news/45476.html

相关文章

SpringCloud网关——GateWay

GateWay 本专栏学习内容来自尚硅谷周阳老师的视频 有兴趣的小伙伴可以点击视频地址观看 概述 SpringCloud Gateway 是 Spring Cloud 的一个全新项目&#xff0c;基于 Spring 5.0Spring Boot 2.0 和 Project Reactor 等技术开发的网关&#xff0c;它旨在为微服务架构提供一种简…

Linux下安装mysql

文章目录 1. 上传安装包2. 检查Linux下是否存在冲突软件3. 解压安装包4. 在安装目录执行rpm安装命令5.检查配置参数6. 初始化mysql7. 查看生成的临时root用户密码8. 启动mysql服务9. 登录mysql10. 修改root用户的密码11. 允许任意ip可以使用root用户登录mysql12. 退出mysql13.关…

redis哨兵机制详解

文章目录 前言监控&#xff08;Monitoring&#xff09;自动故障转移&#xff08;Automatic failover&#xff09;配置提供者&#xff08;Configuration provider&#xff09;通知&#xff08;Notification&#xff09; 哨兵集群的组建哨兵监控Redis库主库下线的判定主观下线客观…

施工阶段如何应用BIM技术,建模助手有话说

​近些年来&#xff0c;越来越多的建筑项目采用BIM来提升管理水平和品质&#xff0c;特别在施工阶段&#xff0c;通过BIM技术可以将施工现场3D模型与施工进度链接&#xff0c;超前模拟施工情况&#xff0c;完成各种精细化施工方案&#xff0c;除了保障施工工作顺利推进&#xf…

word脚标【格式:第X页(共X页)】

不得不吐槽一下这个论文&#xff0c;真的我好头疼啊。我又菜又不想改。但是还是得爬起来改 &#xff08;是谁大半夜不能睡觉加班加点改格式啊&#xff09; 如何插入页码。 格式、要求如下: 操作步骤&#xff1a; ①双击页脚&#xff0c;填好格式&#xff0c;宋体小四和居中都…

synchronized原理详解

众所周知&#xff0c;使用多线程可以极大地提升程序的性能&#xff0c;但如果多线程使用不合理&#xff0c;也会带来很多不可控的问题&#xff0c;例如线程安全问题。 什么是线程安全问题呢&#xff1f;如果多个线程同时访问某个方法时&#xff0c;这个方法无法得到我们预期的…

Day943.持续集成流水线 -系统重构实战

持续集成流水线 Hi&#xff0c;我是阿昌&#xff0c;今天学习记录的是关于持续集成流水线的内容。 从团队协作的角度上来看&#xff0c;在版本发布过程中&#xff0c;经常出现测试依赖开发手工生成制品、版本发布也从开发本地出版本的问题。而且项目架构如果从单体演进至组件…

C++算法恢复训练之快速排序

快速排序&#xff08;Quick Sort&#xff09;是一种基于分治思想的排序算法&#xff0c;它通过将待排序数组分成两个子数组&#xff0c;其中一个子数组的所有元素都比另一个子数组的元素小&#xff0c;然后对这两个子数组递归地进行排序&#xff0c;最终将整个数组排序。快速排…