21.有效的括号

20. 有效的括号

给定一个只包括 '('')''{''}''['']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

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

 

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true

 

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成
 1 class Solution {
 2     public boolean isValid(String s) {
 3         int n = s.length();
 4         if (n % 2 == 1) return false;     
 5 
 6         Map<Character,Character> pairs = new HashMap<Character,Character>() {{
 7             // 将右括号作为key,左括号作为值,因为匹配时我们是将右边括号与已进栈的左括号进行匹配
 8             put(')','(');
 9             put(']','[');
10             put('}','{');
11         }};
12       // 也可使用ArrayDeque:  Deque<Character> stack = new ArrayDeque();
13         Deque<Character> stack = new LinkedList<Character>();
14         for (int i = 0;i < n;i++) {
15             char ch = s.charAt(i);
16             if(pairs.containsKey(ch)) {
17                 // 在map中,但不一定在栈中有匹配的,因此需要排除栈空,和左右括号不一致两种情况
18                 if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
19                     return false;
20                 }
21                 // 左括号出栈
22                 stack.pop();
23             } else {
24                 // 未匹配成功,压栈
25                 stack.push(ch);
26             }
27         }
28         return stack.isEmpty();
29     }
30 }

 

posted on 2022-06-19 17:40  HHHuskie  阅读(26)  评论(0编辑  收藏  举报

导航