思路:使用栈,将左括号入栈,如果来了左括号,继续入栈,如果来了右括号,判断栈顶元素与该右括号是否匹配,如果不匹配直接返回 false,如果匹配则弹出栈顶元素。
注意stack.Peek 与 stack.pop 的异同点 :
相同点:大家都返回栈顶的值
不同点:peek 不改变栈的值(不删除栈顶的值),pop会把栈顶的值删除
class Solution {
public boolean isValid(String s) {
int n = s.length();
if(n % 2 == 1) return false;
Map<Character, Character> map = new HashMap<>(){{
put(')','(');
put(']','[');
put('}','{');
}};
Deque<Character> stack = new LinkedList<>();
for(int i = 0; i < n ; i++){
char ch = s.charAt(i);
if(map.containsKey(ch)){
if(stack.isEmpty() || stack.peek() != map.get(ch)){
return false;
}
stack.pop();
}else{
stack.push(ch);
}
}
return stack.isEmpty();
}
}
思路2:一共就三种括号,没必要用map存储,碰到左括号就将对应的右括号入栈。
public static boolean isValid2(String s) {
LinkedList<Character> stack = new LinkedList<>();
for (char c : s.toCharArray()) {
if (c == '[') stack.push(']');
else if (c == '(') stack.push(')');
else if (c == '{') stack.push('}');
// stack.pop()弹出后删除栈顶元素
else if (stack.isEmpty() || c != stack.pop()) return false;
}
return stack.isEmpty();
}