当前位置: 首页 > 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.dtcms.com/a/320628.html

相关文章:

  • FPS游戏准心跳动效果实现指南
  • 为什么通过CreateThread创建的线程调用C/C++运行库函数不稳定
  • Sum of Four Values(sorting and searching)
  • 力扣-438.找到字符串中所有字母异位词
  • I/O原理与服务。
  • KTH7111-离轴专用芯片,支持自校准,可替MA600和TLE5012,离轴精度可达±0.2
  • Agent配置最佳实践:Prompt工程与参数调优
  • RAG初步实战:从 PDF 到问答:我的第一个轻量级 RAG 系统(附详细项目代码内容与说明)
  • WWDC 25 玻璃态星际联盟:SwiftUI 视图协同“防御协议”
  • 生产管理ERP系统|物联及生产管理ERP系统|基于SprinBoot+vue的制造装备物联及生产管理ERP系统设计与实现(源码+数据库+文档)
  • 2025华数杯数学建模A题【 多孔膜光反射性能的优化与控制】原创论文分享
  • 暴力解决MySQL连接失败
  • 应用层自定义协议
  • Spring系列之Spring AI入门
  • 关于“致命错误:‘https://github.com/....git/‘ 鉴权失败”
  • 基于Vue.js和Golang构建高效在线客服系统:前端实现与后端交互详解
  • Linux学习-数据结构(哈希表)
  • K8s 常见故障案例分析
  • Axure基于中继器实现的组件库(导航菜单、动态表格)
  • k8s调度问题
  • 实战:在已有K8S集群如何新增和删除Node节点
  • 【网络自动化】利用Python脚本与计划任务,实现H3C/HPE设备配置无人值守备份
  • 冰蝎--安装、使用
  • BOM(物料清单)详解:定义、类型、差异与作用
  • 【跨国数仓迁移最佳实践5】MaxCompute近线查询解决方案助力物流电商等实时场景实现高效查询
  • Python 属性描述符(方法是描述符)
  • MySQL 配置性能优化赛:核心策略与实战技巧
  • 新客户 | TDengine 时序数据库是怎么在钢厂“撬动”PI 的?
  • [Flutter] v3.24 AAPT:错误:未找到资源 android:attr/lStar。
  • 详解 Seaborn:让数据可视化更简单高效的 Python 库