问题描述:
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 2:
输入:s = "(){}[]"
输出:true
解析:
遍历字符串,取出单个字符,如果该字符为左括号,则入栈;若为右括号,则与栈顶元素对应的右括号比较是否相等,不相等则匹配失败,相等则继续遍历。
难点:如何优雅的判断字符为左括号?如何得到栈顶元素对应的右括号?
解决:使用map保存括号,map的key保存左括号,map的value保存右括号,使用 map.containsKey(key)解决优雅的判断字符为左括号,使用map.get(key)解决得到栈顶元素的右括号。
代码:
public boolean isValid(String s) {
if (s == null || s.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 < s.length(); i++) {
char c = s.charAt(i);
if (map.containsKey(c)){ //是左括号,就入栈
stack.push(c);
}else { //是右括号,就与栈顶元素对应的右括号匹配
if (stack.isEmpty()){ //栈为空,匹配失败,返回false
return false;
}else { //栈不为空,与栈顶元素对应的右括号匹配
Character key = stack.pop();
Character value = map.get(key);
if (value != c){
return false;
}
}
}
}
return stack.isEmpty();
}