题目描述

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串 s ,判断字符串是否有效。
有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例1:
输入:s = “()”
输出:true

示例2:
输入:s = “()[]{}”
输出:true

示例3:
输入:s = “(]”
输出:false

示例4:
输入:s = “([)]”
输出:false

思路

利用栈,

  1. 遇到左括号,入栈;
  2. 遇到右括号,如果和栈顶元素可以匹配,出栈 否则return false;
  3. 遍历完所有的括号以后,如果栈不为空,return false;

代码

  1. class Solution {
  2. public boolean isValid(String s) {
  3. int len = s.length();
  4. // 奇数个,肯定非法
  5. if (s.length() % 2 == 1) {
  6. return false;
  7. }
  8. // 构造左右括号的map
  9. Map<Character, Character> map = new HashMap<>();
  10. map.put(')', '(');
  11. map.put(']', '[');
  12. map.put('}', '{');
  13. Deque<Character> stack = new ArrayDeque<>();
  14. for (int i = 0; i < len; i++) {
  15. char c = s.charAt(i);
  16. // 不在map中,说明是左括号
  17. // 左括号入栈
  18. if (!map.containsKey(c)) {
  19. stack.offerLast(c);
  20. } else {
  21. // 是右括号,如果此时栈为空,直接返回false即可
  22. // 如果栈顶括号和该右括号不匹配,返回false
  23. if (stack.isEmpty() || stack.peekLast() != map.get(c)) {
  24. return false;
  25. }
  26. // 能运行到这里,说明和栈顶括号和当前的右括号匹配
  27. // 则将栈顶括号出栈
  28. stack.pollLast();
  29. }
  30. }
  31. // 如果遍历结束后,栈不为空,说明有多余的左括号
  32. return stack.isEmpty();
  33. }
  34. }