括号匹配问题,找到符合的进行抵消。
题目
从题可以看出是嵌套的括号先匹配先做抵消,类似就近原则,这也是栈的典型例题。可以通过枚举多种不同的情况慢慢用if与else做返回。
时间复杂度:O(n)
,其中 n
是字符串的长度。空间复杂度:O(n)
,主要来自栈的空间。
class Solution {public boolean isValid(String s) {Stack<Character> stack = new Stack<>();char[] charArray = s.toCharArray();for (char ch : charArray) {//如果是左括号则直接入栈if (ch == '(' || ch == '{' || ch == '[') {stack.push(ch);} else {//如果是右括号,并且此时栈不为空if (!stack.isEmpty()) {if (ch == ')') {if (stack.pop() != '(')return false;} else if (ch == '}') {if (stack.pop() != '{')return false;} else {if (stack.pop() != '[')return false;}}else{ return false;}}}return stack.isEmpty();}
}
通过遍历字符串的字符,把左括号入栈,后面加进的在栈顶,再对右括号出栈看是否能够匹配,不匹配就说明无效,最后还要对栈判空,有可能最后栈还有括号说明有多的没有匹配到也是不符合的。当然,也可以写简洁一些。
class Solution {public boolean isValid(String s) {if(s.isEmpty())return true;Stack<Character> stack=new Stack<Character>();for(char c:s.toCharArray()){if(c=='(')stack.push(')');else if(c=='{')stack.push('}');else if(c=='[')stack.push(']');else if(stack.isEmpty()||c!=stack.pop())return false;}return stack.isEmpty();}
}