503 字
3 分钟
有效的括号

题目描述#

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

解题思路#

  1. 栈结构应用
    • 遍历字符串,遇左括号((, [, {)入栈
    • 遇右括号(), ], })检查栈顶元素是否匹配
  2. 匹配机制
    • 若栈空或不匹配 → 无效
    • 若匹配则弹出栈顶
  3. 结果判定
    • 遍历结束后栈空 → 有效
    • 栈非空 → 无效
  4. 预判优化
    • 字符串长度为奇数直接无效

关键洞察#

  1. 后进先出特性
    • 最近左括号需最先匹配(栈完美实现)
    • 右括号必须匹配当前栈顶
  2. 映射表优化
    • 使用哈希表存储括号对(右→左)
    • 快速判断匹配关系
  3. 无效状态剪枝
    • 栈空遇右括号立即返回
    • 栈非空结束遍历无效
  4. 对称性保障
    • 有效串必有偶数字符
    • 左括号数 = 右括号数

复杂度分析#

指标说明
时间复杂度O(n):遍历字符串一次,栈操作 O(1)
空间复杂度O(n):栈空间(最坏全左括号存储)

代码实现#

/**
* @param {string} s
* @return {boolean}
*/
const isValid = (s) => {
// 奇数长度预判
if (s.length % 2 !== 0) return false;
const stack = [];
// 右括号到左括号的映射
const map = {
')': '(',
']': '[',
'}': '{'
};
for (let char of s) {
if (char === '(' || char === '[' || char === '{') {
stack.push(char); // 左括号入栈
} else {
// 栈空遇右括号 或 栈顶不匹配
if (stack.length === 0 || stack.pop() !== map[char]) {
return false;
}
}
}
return stack.length === 0; // 栈空有效
};

相似题目#

有效的括号
https://website-truelovings-projects.vercel.app/posts/algorithms/有效的括号/
作者
欢迎来到StarSky的网站!
发布于
2025-08-12
许可协议
CC BY-NC-SA 4.0