一、题目描述
给定一个只包括 ‘(’,‘)’,‘{’,‘}’,‘[’,‘]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
二、测试用例
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([])"
输出:true
提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成
三、解题思路
- 基本思路:
用栈进行括号匹配 - 具体思路:
- 定义:stack 用于存放左括号;match 用于括号配对;
- 遍历字符串 s :
- 遇到左括号入栈;
- 遇到右括号则判断栈是否为空
- 为空表示不存在与右括号匹配的左括号,返回 false ;
- 不为空,则判断是否与栈顶元素匹配,如果匹配,则出栈;如果不匹配,则表示配对失败,返回 false ;
- 遍历完字符串,判断栈是否为空,为空则表示全部匹配,返回 true ;不为空,说明还有未匹配的左括号,返回 false 。
四、参考代码
时间复杂度:
O
(
n
)
\Omicron(n)
O(n)
空间复杂度:
O
(
n
)
\Omicron(n)
O(n) 【栈的空间】
class Solution {
public:
bool isValid(string s) {
vector<char> stack;
map<char, char> match = {{')', '('}, {']', '['}, {'}', '{'}};
for (auto& c : s) {
if (match.count(c) == 0) {
stack.push_back(c);
} else {
if (!stack.empty() && match[c] == stack.back()) {
stack.pop_back();
} else {
return false;
}
}
}
return stack.empty();
}
};