文章目录
0效果
1 题目
2 思路
如果字符串是奇数位,肯定存在不匹配的括号,返回false;如果字符串是偶数位,遇到左括号就进栈,遇到右括号,如果和栈顶的左括号匹配,栈顶元素出栈,如果不匹配,返回false,最后如果栈为空,证明括号是完全匹配的,返回true,否则返回false。
官方版答案,使用pair
来判断括号是否匹配,可以少写很多if-else
的代码。想法让人眼前一亮。最后返回栈是否为空,也简化了对返回结果的判定。
3 代码
class Solution {
public:
bool isValid(string s) {
int len = s.length();
if (len % 2 == 1) return false;
stack<char> strStack;
for(int i = 0;i < len;i++){
char tmp= s[i];
if(tmp == '{' || tmp == '[' || tmp == '(') strStack.push(tmp);
else if(tmp == '}' || tmp == ']' || tmp == ')'){
if(strStack.empty()){//一定不存在与之匹配的括号
return false;
}else{//遇到与之匹配的括号,栈中的括号就出栈
if(strStack.top() == '{' && tmp == '}') strStack.pop();
else if(strStack.top() == '[' && tmp == ']') strStack.pop();
else if(strStack.top() == '(' && tmp == ')') strStack.pop();
else return false;
}
}
}
if(strStack.empty()) return true;
else return false;
}
};
官方简化版代码:
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();
}
};