解法一:
从左到右依次遍历,将左括号全部入栈,遍历到右括号与栈顶元素匹配。
class Solution {
public:
bool isValid(string s) {
if (s.size() % 2 != 0) return false;//剪枝,奇数个一定不匹配
stack<char>q;
for(int i=0;i<s.size();i++){
if(s[i]=='('||s[i]=='{'||s[i]=='[')//左括号入栈
q.push(s[i]);
else if(s[i]==')'){//右括号是否匹配,匹配则左括号出栈
if(q.empty()||q.top()!='(')
return false;
else{
q.pop();
}
}
else if(s[i]=='}'){
if(q.empty()||q.top()!='{')
return false;
else{
q.pop();
}
}
else if(s[i]==']'){
if(q.empty()||q.top()!='[')
return false;
else{
q.pop();
}
}
}
if(q.empty())//检查栈是否为空
return true;
else
return false;
}
};
解法二:
遍历到左括号,将对应的右括号入栈。遍历到右括号,与栈内元素进行匹配。
class Solution {
public:
bool isValid(string s) {
if (s.size() % 2 != 0) return false;
stack<char>q;
for(int i=0;i<s.size();i++){//遍历到左括号,将右括号入栈
if(s[i]=='(')
q.push(')');
else if(s[i]=='[')
q.push(']');
else if(s[i]=='{')
q.push('}');
else{
if(q.empty()||q.top()!=s[i])//遍历到右括号,匹配栈顶元素
return false;
else
q.pop();
}
}
if(q.empty())//检查栈是否为空
return true;
else
return false;
}
};
以上内容参考Karl老师的代码随想录,不做为商业用途。