Appearance
实战:有效的括号
这是栈最经典的应用题——括号匹配。
题目描述
LeetCode 20. 有效的括号
给定一个只包括 '(',')','{','}','[',']' 的字符串 s,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合
- 左括号必须以正确的顺序闭合
示例:
输入:s = "()[]{}"
输出:true
输入:s = "(]"
输出:false解法
核心思想:
- 遇到左括号:入栈
- 遇到右括号:检查栈顶是否是对应的左括号
- 是 → 出栈
- 否 → 返回 false
- 最后检查栈是否为空
javascript
function isValid(s) {
const stack = [];
const pairs = {
')': '(',
']': '[',
'}': '{'
};
for (const char of s) {
if (char === '(' || char === '[' || char === '{') {
// 左括号入栈
stack.push(char);
} else {
// 右括号:检查栈顶
if (stack.length === 0 || stack[stack.length - 1] !== pairs[char]) {
return false;
}
stack.pop();
}
}
return stack.length === 0;
}执行过程
s = "([{}])"
遍历过程:
字符 '(':左括号,入栈 → stack: ['(']
字符 '[':左括号,入栈 → stack: ['(', '[']
字符 '{':左括号,入栈 → stack: ['(', '[', '{']
字符 '}':匹配 '{',出栈 → stack: ['(', '[']
字符 ']':匹配 '[',出栈 → stack: ['(']
字符 ')':匹配 '(',出栈 → stack: []
栈为空,返回 true三种无效情况
1. 右括号多余:"]"
遇到 ']' 时栈为空 → 返回 false
2. 括号不匹配:"(]"
栈顶是 '(',但遇到 ']' → 不匹配
3. 左括号多余:"(()["
遍历结束后栈不为空 → 返回 false复杂度
- 时间:O(n),遍历一次
- 空间:O(n),最坏情况栈存储所有字符
本章小结
有效的括号是栈的经典应用:
- 左括号入栈:等待匹配
- 右括号匹配:检查栈顶
- 最后检查:栈必须为空
括号匹配的思想可以扩展到很多场景:HTML 标签匹配、表达式解析等。