题目链接
题目描述
给定一个只包括 '(',')','{','}','[',']'
的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
提示:
- 1 < = s . l e n g t h < = 1 0 4 1 <= s.length <= 10^4 1<=s.length<=104
- s 仅由括号
'()[]{}'
组成
解法:栈
如果 s . s i z e ( ) s.size() s.size() 是一个奇数,那么很显然 s s s 不是一个有效的括号,直接返回 false 即可。
接着用一个栈
s
t
k
stk
stk 来模拟,如果是有效括号,则每一对 () , [] , {}
都是匹配的。如果出现不匹配 或者 栈为空的情况直接返回 false。
如果是有效的括号,最后栈一定是为空的。最后需要再判断栈是否为空。
时间复杂度: O ( n ) O(n) O(n)
C++代码:
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if(n & 1) return false;
stack<char> stk;
for(auto &c:s){
if(c == '{' || c == '(' || c == '[') stk.push(c);
else{
if(stk.empty()) return false;
else if(c == '}' && stk.top() != '{') return false;
else if(c == ']' && stk.top() != '[') return false;
else if(c == ')' && stk.top() != '(') return false;
stk.pop();
}
}
return stk.empty();
}
};