[LeetCode No.20] 有效的括号
题目
题解
方法一:
用两个栈,一个存储左括号,一个存右括号。
如果是左括号,直接入栈
如果是右括号,先入栈,然后判断
1° 左括号栈是否为空
2° 左括号栈取出的左括号是否能和右括号栈顶括号匹配
若可以,则左右括号同时出栈
最后判断左右括号栈是否同时为空
方法二:
一个栈,用于存储左括号
左括号则入栈
如果遇到右括号,判断栈是否为空,是否栈顶左括号能与右括号匹配
如不能则返回false
否则匹配成功把左括号出栈
最后判断,左括号栈是否为空
代码
方法一:
class Solution {
public static boolean isValid(String s) {
int len = s.length();
if (s.isEmpty()||s==""){
return true;
}
if (len%2==1)
return false;
Map<Character,Character> valid = new HashMap<Character, Character>();
valid.put('(',')');
valid.put('{','}');
valid.put('[',']');
//"([}}])"
Deque<Character> left = new ArrayDeque<Character>();
Deque<Character> right = new ArrayDeque<Character>();
for(int i = 0; i < len; i++){
char temp = s.charAt(i);
if (valid.containsKey(temp)){
left.addLast(temp);
}
else{
right.addLast(temp);
if (!left.isEmpty()&&valid.get(left.peekLast()) == temp){
left.pollLast();
right.pollLast();
}
}
}
return left.isEmpty()&&right.isEmpty();
}
}
方法二:
public class Solution2 {
public static boolean isValid(String s) {
int length = s.length();
if (length%2 == 1){
return false;
}
Deque<Character> stack = new ArrayDeque<>();
HashMap<Character,Character> map = new HashMap<Character, Character>();
map.put('(',')');
map.put('[',']');
map.put('{','}');
for (int i = 0; i < length; i++) {
char ch = s.charAt(i);
if (map.containsKey(ch)){
stack.push(ch);
}else{
if (stack.isEmpty()||map.get(stack.peek())!=ch){
return false;
}
stack.pop();
}
}
return stack.isEmpty();
}
}