输入:一个只包括 '(',')','{','}','[',']' 的字符串 s。
要求:判定左右括号顺序是否正确匹配。
输出:true 或者 false
思路:一开始想的很复杂,对应栈空不空以及各个左右括号的情况,依次进行了判定。
实际上,只需要进行左右括号判定就好,左括号就入栈,可以延迟匹配,但是右括号必须立即匹配成功,不然返回false。
需要注意的是,最后需要辅助栈为空才能返回true,不然栈里容易留下没有匹配的左括号。
复杂度:
时间复杂度:O(n)
空间复杂度:O(n)
class Solution {
public:
bool isValid(string s) {
stack<char> tmp;
for (int i = 0; i < s.size(); i++) {
if (tmp.empty() && (s[i] == ')' || s[i] == ']' || s[i] == '}')) {
return false;
}
else if (tmp.empty()) {
tmp.push(s[i]);
}
else if (s[i] == ')' && tmp.top() == '(') {
tmp.pop();
}
else if (s[i] == ']' && tmp.top() == '[') {
tmp.pop();
}
else if (s[i] == '}' && tmp.top() == '{') {
tmp.pop();
}
else if (s[i] == '(' || s[i] == '[' || s[i] == '{' ) {
tmp.push(s[i]);
}
else {
return false;
}
}
//return true;
return tmp.empty();//最后需要栈空才是true
}
};
class Solution {
public:
bool isValid(string s) {
stack<char> tmp;
for (char c : s) {
// 1. 只要是左括号,就压入栈
if (c == '(' || c == '[' || c == '{') {
tmp.push(c);
}
// 2. 否则(即遇到了右括号)
else {
// 此时如果栈是空的(如 "}"),或者栈顶不匹配(如 "(]"),则无效
if (tmp.empty() ||
(c == ')' && tmp.top() != '(') ||
(c == ']' && tmp.top() != '[') ||
(c == '}' && tmp.top() != '{'))
{
return false;
}
// 匹配成功,弹出栈顶的左括号
tmp.pop();
}
}
// 3. 最后,栈必须为空
return tmp.empty();
}
};

被折叠的 条评论
为什么被折叠?



