本题可以很容易的想到用栈去匹配,后出现的左括号必须先匹配到右括号,如
{[()]}
所以当我们的栈顶元素成功匹配到右括号时取出,如果是左括号就进行压栈操作
说一个小技巧,就不用判断当前栈顶元素是哪个括号,或者遍历到的当前位置是哪个括号
查阅ASCALL码表可以得到如下信息
我们可以发现 左括号和其对应的右括号的ascall码差‘1’ 或者‘2’换句话说,当我们发现当前遍历的元素的acall码和栈顶元素的acall码差1 或者 2时我们就匹配到了对应的右括号,可以出栈
代码如下
class Solution {
public boolean isValid(String s) {
if(s.isEmpty()) return true;
Stack<Character> stack = new Stack<>();
stack.push(s.charAt(0));
for (int i = 1; i < s.length(); i++) {
if(stack.isEmpty()){
stack.push(s.charAt(i));
}else {
if(s.charAt(i) - stack.peek() == 1 || s.charAt(i) - stack.peek() == 2){
stack.pop();
}else {
stack.push(s.charAt(i));
}
}
}
if(stack.isEmpty()) return true;
return false;
}
}