题目描述
给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 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;}// 构造左右括号的mapMap<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即可// 如果栈顶括号和该右括号不匹配,返回falseif (stack.isEmpty() || stack.peekLast() != map.get(c)) {return false;}// 能运行到这里,说明和栈顶括号和当前的右括号匹配// 则将栈顶括号出栈stack.pollLast();}}// 如果遍历结束后,栈不为空,说明有多余的左括号return stack.isEmpty();}}
