✏️ 关于专栏:专栏用于记录
prepare for the coding test
。
给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串s
,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
题目链接:有效的括号
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
1 <= s.length <= 104
s
仅由括号 '()[]{}'
组成false
,因为成对括号必须是偶数长度。unordered_map
)存储右括号对应的左括号,便于快速判断匹配关系。false
;false
;false
。示例 | 输入 | 输出 | 说明 |
---|---|---|---|
1 | s = "()" |
true |
简单有效匹配 |
2 | s = "()[]{}" |
true |
多种括号嵌套正确 |
3 | s = "(]" |
false |
括号类型不匹配 |
4 | s = "([])" |
true |
嵌套结构正确 |
5 | s = "((()" |
false |
左括号多余未闭合 |
字符 | 操作 | 栈状态 | 说明 |
---|---|---|---|
( |
左括号入栈 | ( |
左括号压入栈 |
[ |
左括号入栈 | ([ |
左括号压入栈 |
{ |
左括号入栈 | ([{ |
左括号压入栈 |
} |
匹配栈顶 { ,出栈 |
([ |
成功匹配一组括号 |
] |
匹配栈顶 [ ,出栈 |
( |
成功匹配一组括号 |
) |
匹配栈顶 ( ,出栈 |
栈空 | 成功匹配一组括号 |
class Solution {
public:
unordered_map mp = {{')','('},{'}','{'},{']','['}};
bool isValid(string s) {
if(s.length() % 2){
return false;
}
stack 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(如全是左括号) |
“有效的括号”不仅考察栈的基本应用,更是递归思想在非递归形式中的体现 —— 每一对匹配的括号,实质上是问题的一个子结构。
️ 掌握本题思路后,可一并解决如“最小删除使括号有效”、“最长有效括号”等进阶问题,形成以“括号问题”为核心的算法解题体系。
推荐刷题顺序:20 ➝ 22 ➝ 32 ➝ 150
难度 | 题目 | 说明 |
---|---|---|
⭐⭐ | LeetCode 20. 有效的括号 | 当前题目 |
⭐⭐⭐ | LeetCode 32. 最长有效括号 | 动态规划/栈/双指针 |
⭐⭐⭐ | LeetCode 150. 逆波兰表达式求值 | 栈表达式 |
⭐⭐⭐ | LeetCode 22. 括号生成 | 回溯/DFS |
❤️ 如果对你有帮助,别忘了点赞、收藏支持一下,我将持续更新更多高质量刷题笔记!
点击查看 算法笔记专栏:Prepare for the Coding Test