LeetCode-栈-有效的括号
✏️ 关于专栏:专栏用于记录
prepare for the coding test
。
📝 有效的括号
🎯题目描述
给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串s
,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
🔗题目链接:有效的括号
🔍 输入输出示例
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
🧩题目提示
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
🧪AC
- 提前剪枝:如果字符串长度为奇数,直接返回
false
,因为成对括号必须是偶数长度。 - 映射构建:使用哈希表(
unordered_map
)存储右括号对应的左括号,便于快速判断匹配关系。 - 遍历字符:
- 如果是左括号(不在 map 中),入栈;
- 如果是右括号:
- 若栈为空,返回
false
; - 若栈顶不是其匹配的左括号,返回
false
; - 否则,弹出栈顶,表示匹配成功。
- 若栈为空,返回
- 遍历结束后判断栈是否为空:
- 空栈:所有括号匹配成功;
- 非空:存在未匹配的左括号,返回
false
。
示例 | 输入 | 输出 | 说明 |
---|---|---|---|
1 | s = "()" | true | 简单有效匹配 |
2 | s = "()[]{}" | true | 多种括号嵌套正确 |
3 | s = "(]" | false | 括号类型不匹配 |
4 | s = "([])" | true | 嵌套结构正确 |
5 | s = "((()" | false | 左括号多余未闭合 |
字符 | 操作 | 栈状态 | 说明 |
---|---|---|---|
( | 左括号入栈 | ( | 左括号压入栈 |
[ | 左括号入栈 | ([ | 左括号压入栈 |
{ | 左括号入栈 | ([{ | 左括号压入栈 |
} | 匹配栈顶 { ,出栈 | ([ | 成功匹配一组括号 |
] | 匹配栈顶 [ ,出栈 | ( | 成功匹配一组括号 |
) | 匹配栈顶 ( ,出栈 | 栈空 | 成功匹配一组括号 |
class Solution {
public:
unordered_map<char,char> mp = {{')','('},{'}','{'},{']','['}};
bool isValid(string s) {
if(s.length() % 2){
return false;
}
stack<char> stk;
for(char c:s){
if(!mp.contains(c)){
stk.push(c);
}else{
if(stk.empty() || stk.top() != mp[c]){
return false;
}
stk.pop();
}
}
return stk.empty();
}
};
类型 | 分析 |
---|---|
时间复杂度 | O(n),n 为字符串长度,每个字符仅遍历一次 |
空间复杂度 | O(n),最坏情况栈空间接近 n(如全是左括号) |
🌟 总结
- 本题考察数据结构:栈的应用。
- 括号匹配问题的通用解法就是利用**后进先出(LIFO)**的特点来模拟括号匹配过程。
- 使用哈希表提高匹配效率,使代码更简洁优雅。
- 别忘了处理栈为空和字符串长度奇数的特殊情况。
🧩 “有效的括号”不仅考察栈的基本应用,更是递归思想在非递归形式中的体现 —— 每一对匹配的括号,实质上是问题的一个子结构。
🛠️ 掌握本题思路后,可一并解决如“最小删除使括号有效”、“最长有效括号”等进阶问题,形成以“括号问题”为核心的算法解题体系。
🎯 推荐刷题顺序:20 ➝ 22 ➝ 32 ➝ 150
难度 | 题目 | 说明 |
---|---|---|
⭐⭐ | LeetCode 20. 有效的括号 | 当前题目 |
⭐⭐⭐ | LeetCode 32. 最长有效括号 | 动态规划/栈/双指针 |
⭐⭐⭐ | LeetCode 150. 逆波兰表达式求值 | 栈表达式 |
⭐⭐⭐ | LeetCode 22. 括号生成 | 回溯/DFS |
❤️ 如果对你有帮助,别忘了点赞、收藏支持一下,我将持续更新更多高质量刷题笔记!
📘 点击查看 👉 算法笔记专栏:Prepare for the Coding Test