题名:LeetCode 20.有效的括号 参考:LeetCode官方题解 内容:重新写了一遍自己的理解 差别:没啥差别,为了加强记忆写的 0.0 语言:Java 标签:简单
 
 
主要数据结构:
 
栈:正括号压入栈,反括号和最近的一个正括号抵消。因为()算有效的括号,而)(不算,若压入反括号,当栈为空的时候,有可能不是有效的括号。如果不嫌麻烦的话,用队列也可以。(俺没试过队列 0.0)HashMap:对应正括号和反括号的。注意:key为反括号,value为正括号。因为当栈取出最顶上那层的正括号时,若要使其为有效字符串,下一个字符肯定是反括号,而如果key为正括号,value为反括号,map.get(反括号)会抛出空指针错误。 
思路:
 
正括号压入栈,若出现第一个反括号,消掉与其最近的正括号 
代码:
 
import java
.util
.HashMap
;
import java
.util
.Stack
;
public class ValidBracket {
    public static void main(String
[] args
) {
        Solution s
=new Solution();
        System
.out
.println(s
.isValid("{[[]}}[}()"));
    }
}
class Solution{
    public boolean isValid(String s
){
        
        HashMap
<Character,Character> map
=new HashMap<>();
        map
.put('}','{');
        map
.put(']','[');
        map
.put(')','(');
        Stack
<Character> stack
= new Stack<>();        
        
       for (int i
=0;i
<s
.length();i
++){
           char c
=s
.charAt(i
);  
           if (map
.containsKey(c
)){      
               
               
               char topElement
=stack
.empty()?'#': stack
.pop();
               if (topElement
!=map
.get(c
)){
                   return false;
               }    
               
           }else{                        
               stack
.push(c
);
           }
       }
       return stack
.empty();    
    }
}
 
出现过的Bug:
 
 Bug 1: NullPointerException Stack<Character> stack=new Stack(); 没写类型Character,导致默认类型为Object,并将stack.pop()强制转换为char型 空指针报错原因
  Bug 2:NullPointerException if (topElement!=map.get(c)) 此时topElement为正括号,c为反括号,map里的key全是正括号,所以当map.get(key)时,会出现空指针报错。 修改:把key和value反过来存,其余的也要改。 也可以不修改,HashMap根据Value获取Key。