题目描述:
方法一(不用map):
利用stack的性质——栈顶元素先出,将’{’,’[’,’(‘转化为’}’,’]’,’)‘存入栈中与字符串后面的’}’,’]’,’)'进行比较抵消,来实现有效字符串的判断。
模拟代码执行:
以字符串“{([])[()]}”为例
代码:
class Solution {
public boolean isValid(String s) {
if(s.length() ==0 || s == null){//已知空字符串是有效字符串
return true;
}
Stack<Character> stack = new Stack<Character>();
char[] ch = s.toCharArray();
for(char c : ch){
if(c == '{'){
stack.push('}');
}else if(c == '('){
stack.push(')');
}else if(c == '['){
stack.push(']');
}else if(stack.isEmpty() || c != stack.pop()){//如果第一个字符是'}',']',')'中的一个,就不用再继续判断了,直接false,而||后的条件满足,则说明括号匹配不成功,次序有问题,也false掉。
return false;
}
}
if(stack.isEmpty()){
return true;
}
return false;
}
}
结果:
方法二(用hashmap):
用hashmap来进行有效括号的匹配,要往stack和map加入一个非’{’,’[’,’(’,’}’,’]’,’)'的字符,不然会报栈空异常(如下图)。
下面的代码可以不用做最后那个if判断,直接return stack.size() == 1也行。
代码:
class Solution {
public boolean isValid(String s) {
if(s.length() == 0 || s == null){
return true;
}
HashMap<Character,Character> map = new HashMap<Character,Character>();
map.put('(',')');
map.put('{','}');
map.put('[',']');
map.put('N','N');
if(s.length() > 0 && !map.containsKey(s.charAt(0))){
return false;
}
Stack<Character> stack = new Stack<Character>();
stack.push('N');
char[] ch = s.toCharArray();
for(int i = 0; i < ch.length; i++){
if(map.containsKey(ch[i])){
stack.push(ch[i]);
}else if(map.get(stack.pop()) != ch[i]){
return false;
}
}
if(stack.size() == 1){
return true;
}
return false;
}
}
结果: