题目描述
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
示例1:
输入:s = “()”
输出:true
示例2:
输入:s = “()[]{}”
输出:true
示例3:
输入:s = “(]”
输出:false
示例4:
输入:s = “([)]”
输出:false
思路
利用栈,
- 遇到左括号,入栈;
- 遇到右括号,如果和栈顶元素可以匹配,出栈 否则return false;
- 遍历完所有的括号以后,如果栈不为空,return false;
代码
class Solution {
public boolean isValid(String s) {
int len = s.length();
// 奇数个,肯定非法
if (s.length() % 2 == 1) {
return false;
}
// 构造左右括号的map
Map<Character, Character> map = new HashMap<>();
map.put(')', '(');
map.put(']', '[');
map.put('}', '{');
Deque<Character> stack = new ArrayDeque<>();
for (int i = 0; i < len; i++) {
char c = s.charAt(i);
// 不在map中,说明是左括号
// 左括号入栈
if (!map.containsKey(c)) {
stack.offerLast(c);
} else {
// 是右括号,如果此时栈为空,直接返回false即可
// 如果栈顶括号和该右括号不匹配,返回false
if (stack.isEmpty() || stack.peekLast() != map.get(c)) {
return false;
}
// 能运行到这里,说明和栈顶括号和当前的右括号匹配
// 则将栈顶括号出栈
stack.pollLast();
}
}
// 如果遍历结束后,栈不为空,说明有多余的左括号
return stack.isEmpty();
}
}