20. 有效的括号
题目:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。
示例 1:
输入: "()"
输出: true
示例 2:
输入: "()[]{}"
输出: true
示例 3:
输入: "(]"
输出: false
示例 4:
输入: "([)]"
输出: false
示例 5:
输入: "{[]}"
输出: true
题解1:使用栈,对左括号入栈,对右括号出栈判断
主要流程:
- 提前判断,若字符串长度为奇数,则返回false
- 创建map,使用key,value来存储左右括号
- 遍历字符串进行如下操作:
- 保存当前字符为c,如果遇到左括号,将该元素入栈,
- 否则遇到右括号,判断此时栈为空或栈顶元素与c不匹配,若是则返回匹配失败,返回false
- 之后再进行出栈操作即可。
- 遍历完成后,若栈空,则返回true,否则返回false
代码:
class Solution {
public boolean isValid(String s) {
// //如果length为奇数,可以直接返回false
if (s.length() % 2 == 1) {
return false;
}
//创建map
Map<Character, Character> map = new HashMap<>();
map.put('{', '}');
map.put('[', ']');
map.put('(', ')');
Stack<Character> stack = new Stack<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (map.containsKey(c)) {//此时为左括号,入栈即可
stack.push(c);
} else {//此时为右括号,出栈与c判断
if (stack.isEmpty() || map.get(stack.peek()) != c) {//判断栈顶元素是否与c匹配,不匹配返回false
return false;
}
stack.pop();//匹配成功,出栈继续
}
}
return stack.isEmpty();//栈为空时返回true
}
}
写法2:
class Solution {
public boolean isValid(String s) {
if (s.length() == 0) return true;
Map<Character, Character> map = new HashMap<>();
map.put('{', '}');
map.put('[', ']');
map.put('(', ')');
Deque<Character> stack = new ArrayDeque<>();
int len = s.length();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
if (map.containsKey(c)) {
stack.offerLast(c);
} else {
if (stack.isEmpty() || map.get(stack.peekLast()) != c) {
return false;
}
stack.pollLast();
}
}
return stack.isEmpty();
}
}