原题链接
方法一:解题思路,使用栈 + 模拟法;首先遍历将是左括号形式的部分压入栈中。然后对于右括号形式与栈顶元素进行比对,看是否匹配。如果匹配的话删除栈顶元素,不匹配直接返回false。最后栈为空则全部的括号匹配,否则返回false。
class Solution {
public:bool isValid(string s) {stack<char> tempStack;for(char& c: s){switch(c){case '(':case '{':case '[': tempStack.push(c);break;case ')':if(tempStack.empty() || tempStack.top() !='(')return false;elsetempStack.pop();break;case '}':if(tempStack.empty() || tempStack.top() !='{')return false;elsetempStack.pop();break;case ']':if(tempStack.empty() || tempStack.top() !='[')return false;elsetempStack.pop();break; }} return tempStack.empty(); }
};
方式二:通过左右括号在ASCII码中相差不超过2(<=2),通过这一点。可以先将左括号的形式压入栈中,如果是右括号形式匹配就删除栈顶元素。如果不匹配直接返回false。最后依然是查看是否栈为空。
class Solution {
public:bool isValid(string s) {stack<char> stk;for (auto c : s) {if (c == '(' || c == '[' || c == '{') stk.push(c);else {if (stk.size() && abs(stk.top() - c) <= 2) stk.pop();else return false;}}return stk.empty();}
};