LeetCode--有效的括号

题目:

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

  有效字符串需满足:

    1、左括号必须用相同类型的右括号闭合

    2、左括号必须以正确的顺序闭合

    3、空字符串可认为是有效字符串

  

  看到括号匹配就想到可能要用到栈,所以提交的代码是:

 1 import java.util.*;
 2 
 3 public class Solution {
 4     public boolean isValid(String s) {
 5         if(s == null || s.length() == 0) return true;
 6         
 7         Map<Character, Character> map = new HashMap<Character, Character>() {
 8             {
 9                 put(')', '(');
10                 put('}', '{');
11                 put(']', '[');
12             }
13         };
14         
15         Stack<Character> stack = new Stack<>();
16         for(int i = 0; i < s.length(); i++)
17         {
18             if(s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{')
19             {
20                 stack.push(s.charAt(i));
21             }
22             else
23             {
24                 if(stack.empty() || stack.pop() != map.get(s.charAt(i)))
25                 {
26                     return false;
27                 }
28             }
29         }
30         return stack.empty();
31     }
32 }

 

  官方题解也是用到栈,思想是一致的,只是实现细节上有点不同,当括号的类型只有几种时,可以使用上面代码第18行使用的枚举法来逐一判断,但如果候选类型很多的话,使用枚举法就不实际了, 更好的方法是使用map的containsKey或containsValue方法来判断,如下代码所示:

 1 import java.util.*;
 2 
 3 public class Solution {
 4     
 5     public boolean isValid(String s) {
 6         if(s == null || s.length() == 0) return true;
 7         
 8         Map<Character, Character> map = new HashMap<Character, Character>() {
 9             {
10                 put(')', '(');
11                 put('}', '{');
12                 put(']', '[');
13             }
14         };
15         
16         Stack<Character> stack = new Stack<>();
17         for(int i = 0; i < s.length(); i++)
18         {
19             char c = s.charAt(i);
20             {     
21                 if(stack.empty() || stack.pop() != map.get(c))
22                 {
23                     return false;
24                 }
25             }
26             else
27             {
28                 stack.push(c);
29             }
30         }
31         return stack.empty();
32     }
33 }

 

posted @ 2019-10-23 13:15  Latuper  阅读(263)  评论(0编辑  收藏  举报