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

leetcode热题——有效的括号

有效的括号

题目描述

给定一个只包含 '(', ')', '{', '}', '[', ']' 的字符串,判断是否每个左括号都能被正确的右括号闭合,并且顺序正确。

例如:

输入输出解释
"()"true成对
"()[]{}"true成对,顺序正确
"(]"false括号类型不匹配
"([)]"false顺序不正确
"{[]}"true成对嵌套

解题思路

这道题是使用栈解决的经典问题。

为什么可以用栈来做?

栈是一种后进先出(LIFO)的数据结构,非常适合处理成对出现且嵌套结构的问题。

想象如下字符串:

"{ [ ( ) ] }"

从左往右处理:

  • 遇到左括号时就压入栈。
  • 遇到右括号时,从栈顶取出最近的左括号,检查是否与当前右括号匹配。
  • 匹配则继续,不匹配则返回 false。

以字符串 "{(){[]}}" 为例: 步骤如下:

i当前字符栈操作栈状态说明
0{入栈{左括号入栈
1(入栈{ (左括号入栈
2)匹配 & 出栈{) ↔ ( 成功匹配
3{入栈{ {左括号入栈
4[入栈{ { [左括号入栈
5]匹配 & 出栈{ {] ↔ [ 成功匹配
6}匹配 & 出栈{} ↔ { 成功匹配
7}匹配 & 出栈} ↔ { 成功匹配

C++ 代码实现

bool isValid(string s) {stack<char> stk;for (char ch : s) {// 左括号,压入栈if (ch == '(' || ch == '{' || ch == '[')stk.push(ch);else {// 遇到右括号,栈必须非空if (stk.empty()) return false;char top = stk.top();// 判断是否匹配if ((ch == ')' && top != '(') ||(ch == '}' && top != '{') ||(ch == ']' && top != '['))return false;stk.pop(); // 匹配成功,弹出}}// 如果所有括号都匹配,栈应为空return stk.empty();
}

复杂度分析

时间复杂度:O(n),只遍历一次字符串

空间复杂度:O(n),最坏情况下栈中存放所有左括号

代码优化

优化一:

如果字符串长度是奇数(n % 2 == 1),直接返回 false,因为括号必须成对出现,不可能匹配成功。

        int n = s.size();if (n % 2 == 1) {return false;}

优化二:

定义一个哈希表 pairs,用于映射每个右括号对应的左括号。

        unordered_map<char, char> pairs = {{')', '('},{']', '['},{'}', '{'}};

用哈希表 unordered_map 映射右括号对应的左括号,方便查找。而且可以提高代码的可扩展性,逻辑更清晰。

C++ 代码实现

class Solution {
public:// 判断输入字符串中的括号是否成对匹配bool isValid(string s) {int n = s.size();// 若长度为奇数,不可能完全配对,直接返回 falseif (n % 2 == 1) {return false;}// 定义右括号到左括号的映射关系unordered_map<char, char> pairs = {{')', '('},{']', '['},{'}', '{'}};stack<char> stk; // 用栈来存储尚未匹配的左括号// 遍历字符串中的每一个字符for (char ch : s) {// 如果是右括号if (pairs.count(ch)) {// 栈为空或栈顶不是对应的左括号,说明匹配失败if (stk.empty() || stk.top() != pairs[ch]) {return false;}stk.pop(); // 匹配成功,弹出左括号} else {// 是左括号,入栈stk.push(ch);}}// 最终栈为空,说明所有括号都匹配成功return stk.empty();}
};
http://www.lryc.cn/news/614571.html

相关文章:

  • 安全合规1--实验:ARP欺骗、mac洪水攻击、ICMP攻击、TCP SYN Flood攻击
  • C++AVL树
  • windows自动获取wsl IP,并开启端口转发。
  • 供应链项目中产品的ABC XYZ分类法弊端(十)
  • 常见通信协议详解:TCP、UDP、HTTP/HTTPS、WebSocket 与 RPC
  • [科普] AI加速器架构全景图:从GPU到光计算的算力革命
  • 【0基础3ds Max】主工具栏介绍(上)
  • [链表]142. 环形链表 II
  • Java 大视界 -- 基于 Java 的大数据分布式计算在气象灾害数值模拟与预警中的应用(388)
  • 大模型性能测试实战指南:从原理到落地的全链路解析
  • 【Day 19】Linux-网站操作
  • 小程序难调的组件
  • Vite 深度解析:现代前端开发引擎
  • AI 记忆管理系统:工程实现设计方案
  • Introducing Visual Perception Token into Multimodal Large Language Model论文解读
  • 脚本统计MongoDB集合结构信息
  • 关于数据结构6-哈希表和5种排序算法
  • WSL安装MuJoco报错——FatalError: gladLoadGL error
  • Vue框架总结案例
  • HTML <picture> 元素:让图片根据设备 “智能切换” 的响应式方案
  • OpenAI 开源 GPT-OSS:1200亿参数推理模型上线,完全免费、商用可用,全民可控智能体时代正式开启!
  • 《前端60问:从设备判断到性能优化全解》
  • PeiQi网络安全知识文库PeiQi-WIKI-Book保姆式搭建部署教程
  • Nearest Smaller Values(sorting and searching)
  • 饿了么零售 sign 分析
  • lmbench在麒麟V10的编译测试
  • 水系热力图:制作化学污染物浓度值热力图
  • 深入理解 Java AWT Container:原理、实战与性能优化
  • vue项目常见BUG和优化注意事项
  • 论文reading学习记录7 - daily - ViP3D