括号匹配问题
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
public static Boolean isVaild(String str){
if(str.length()<=1){
return false;
}
Map<Character,Character> map = new HashMap<>();
map.put('[',']');
map.put('{','}');
map.put('(',')');
Stack<Character> stack = new Stack<>();
for (int i = 0; i <str.length() ; i++) {
Character item = str.charAt(i);
//containsKey(item):判断当前map中是否有key为item的键值对
//map中的key全部为左括号,判断当前输入的字符是否为左括号,
// 是则将左括号入栈
// 不是则进入else
if(map.containsKey(item)){
stack.push(item);
}else{
if(!stack.isEmpty()){
//将栈顶的左括号弹出,使用map.get()得到与栈顶相匹配的右括号
//将栈顶右括号与当前输入字符相比
Character pop = stack.pop();
if(item != map.get(pop)){
return false;
}
}else {
return false;
}
}
}
return stack.isEmpty();
}
问题一:为什么在括号匹配之前要先进行判空?
当给定字符串为“{{}})”,栈内两个左括号都因匹配成功而被弹出栈,此时只剩一个右括号,那么肯定是匹配不成功的,所以在匹配之前检查一下栈是否为空,为空直接返回false;
问题二:为什么最后的返回值是stack.isEmpty()而不是直接返回true?
当给定字符串为“{{}}(”,内两个左括号都因匹配成功而被弹出栈,此时只剩一个左括号,那么肯定是匹配不成功的,所以不能直接返回true