当前位置: 首页 > news >正文

LeetCode刷题记录----20.有效的括号(Easy)

2025/9/7

20. 有效的括号

题目(Easy):


我的思路:

因为每一个右括号一定需要一个左括号来对应配对,且当右括号出现的时候需要马上进行这个匹配,而要进行匹配的是当前最后一个左括号。因此我们可以考虑使用栈的数据结构来处理这一过程。即:

①当前字符为左括号则直接入栈

②当前字符为右括号则和栈顶元素进行匹配,查看是否为目标的左括号(如果不存在栈顶元素那直接为false)

③最后都匹配完成的话栈应该是空

因此,大致的代码如下:

class Solution {
public:bool isValid(string s) {//左括号直接入栈,右括号和当前栈顶括号比较vector<char> stack;for(int i = 0; i < s.size(); i++){char c =  s[i];if(c == '(' || c == '[' || c == '{'){//直接压入stack.emplace_back(c);}else{//先看栈顶还有没有if(stack.size() == 0)return false;char top = stack.back();stack.pop_back();if((c == ')' && top != '(') ||(c == ']' && top != '[') ||(c == '}' && top != '{')){return false;}}}return stack.size() == 0;}
};

时间复杂度:O(N)【需要遍历整个字符串】

空间复杂度:O(N)【最坏的情况下全部是左括号,都要入栈】


优化思路:

这里优化主要就是对初始字符串和匹配的过程进行优化。

初始字符串如果是奇数的话,那肯定完不成匹配,所以不用进入后续的判断

匹配的时候我们用一个初始的哈希表来进行左右括号的区分与匹配

同时我们可以用C++内部定义好的真的栈

具体代码如下:

class Solution {
public:bool isValid(string s) {//左括号直接入栈,右括号和当前栈顶括号比较int n = s.size();//如果长度为奇数的话那肯定配对失败了if(n % 2 != 0)return false;   //用栈来判断stack<char> stk;//用一个哈希表来快速比对unordered_map<char, char> pairs = {{')', '('},{']', '['},{'}', '{'}};for(const char c : s){if(pairs.count(c)){//判断当前栈是否为空 或者 栈顶元素是否不匹配if(stk.empty() || stk.top() != pairs[c])return false;stk.pop();  //能走到这里说明匹配了,直接弹出栈顶元素}else{//否则肯定是( { [  ,直接压入就好stk.push(c);          }}return stk.empty();}
};

时间复杂度:O(N)

空间复杂度:O(N + 字符集长度)【字符集长度是指哈希表占的空间】


总结:

①C++中有定义好了的栈stack,它的查看栈顶元素是stack.top()但是不会弹出,弹出要再手动调用stack.pop()

②这里根据左右括号的匹配特性,可以利用哈希表来让可读性更好一些


文章转载自:

http://x1EPPGFZ.kxrLd.cn
http://TJgv6PPt.kxrLd.cn
http://CF3rxXoP.kxrLd.cn
http://oBVi3RTi.kxrLd.cn
http://EjNbEq26.kxrLd.cn
http://wPmXihYv.kxrLd.cn
http://bmCNLkN8.kxrLd.cn
http://YtnULnGg.kxrLd.cn
http://lgEVFsWM.kxrLd.cn
http://vmDVjUCx.kxrLd.cn
http://hwABuOXq.kxrLd.cn
http://Ot79VfrQ.kxrLd.cn
http://SdlrwMLg.kxrLd.cn
http://epfLhXYB.kxrLd.cn
http://KvO6VUlC.kxrLd.cn
http://2SE9HGA5.kxrLd.cn
http://WO7QRbLJ.kxrLd.cn
http://fjlEtBmE.kxrLd.cn
http://RUlTl8qa.kxrLd.cn
http://FIhGFEqU.kxrLd.cn
http://GxzRzK3g.kxrLd.cn
http://AKqiAQuN.kxrLd.cn
http://bYipEB05.kxrLd.cn
http://So7at5fz.kxrLd.cn
http://VQXsY5w9.kxrLd.cn
http://CDYyvY7g.kxrLd.cn
http://6DjzeePX.kxrLd.cn
http://e0gYwQY6.kxrLd.cn
http://RPE9QRSh.kxrLd.cn
http://5a8iuEQq.kxrLd.cn
http://www.dtcms.com/a/371742.html

相关文章:

  • 从voice和练习发声谈起
  • 5.python——数字
  • 数据化运营的工作流程
  • llama_factory 安装以及大模型微调
  • Linux | i.MX6ULL 搭建 Web 服务器(第二十章)
  • 量子電腦組裝之三
  • 适配器详细
  • GD32自学笔记:5.定时器中断
  • 前端三件套简单学习:HTML篇1
  • Android --- SystemUI 导入Android Studio及debug
  • 服务器为什么会选择暴雨?
  • Spring Boot + Apache Tika 从文件或文件流中提取文本内容
  • day26|学习前端之算法学习
  • 数据结构之二叉树(2)
  • Mac设置中的安全性缺少“任何来源”
  • 样式化你的 Next.js 应用:CSS 模块、Tailwind CSS 和全局样式
  • Qwen2.5-VL技术详解
  • Claude code 使用笔记
  • FPGA学习笔记——SDR SDRAM的读写(不调用IP核版)
  • C++ 常见面试题汇总
  • cifar10分类对比:使用PyTorch卷积神经网络和SVM
  • 2025算法八股——机器学习——SVM损失函数
  • kafka特性和原理
  • webpack和vite优化方案都有哪些
  • Unity UI 中最干净的点击区域实现:RaycastZone 完整实战讲解
  • Java开发环境配置入门指南
  • lua中table键类型及lua中table的初始化有几种方式
  • 【CMake】缓存变量
  • Flink NetworkBufferPool核心原理解析
  • python数据可视化之Matplotlib(8)-Matplotlib样式系统深度解析:从入门到企业级应用