题名: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。