题目简述
给定一个只包括 ‘(’,’)’,’{’,’}’,’[’,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例 1:
输入:s = “()”
输出:true
示例 2:
输入:s = “()[]{}”
输出:true
示例 3:
输入:s = “(]”
输出:false
示例4:
输入:s = “([)]”
输出:false
示例5:
输入:s = “{[]}”
输出:true
提示
1 <= s.length <= 104
s 仅由括号 ‘()[]{}’ 组成
题目分析
本题是很经典的栈操作题,直接利用栈的特性即可。但是在操作中比较容易出错,由于本人对于map掌握的不是很好,所以用了暴力解题的方法。代码如下:
class Solution {
public:
bool isValid(string s) {
int n=s.length();
if(n%2!=0)return false;
stack<int> brackets;
if(s[0]==')'||s[0]==']'||s[0]=='}')return false;
for(int i=0;i<n;i++ ){
if(s[i]=='('||s[i]=='['||s[i]=='{')brackets.push(s[i]);
if(s[i]==')'){
if(brackets.empty())return false;
if(brackets.top()=='(')brackets.pop();
else return false;
}
if(s[i]==']'){
if(brackets.empty())return false;
if(brackets.top()=='[')brackets.pop();
else return false;
}
if(s[i]=='}'){
if(brackets.empty())return false;
if(brackets.top()=='{')brackets.pop();
else return false;
}
}
if(brackets.empty())return true;
else return false;
}
};
如果熟悉map的话括号匹配就不用这么麻烦了,可以直接判断。
class Solution {
public:
bool isValid(string s) {
int n = s.size();
if (n % 2 == 1) {
return false;
}
unordered_map<char, char> pairs = {
{')', '('},
{']', '['},
{'}', '{'}
};
stack<char> stk;
for (char ch: s) {
if (pairs.count(ch)) {
if (stk.empty() || stk.top() != pairs[ch]) {
return false;
}
stk.pop();
}
else {
stk.push(ch);
}
}
return stk.empty();
}
};