给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
思路
-
首先我们维护一个map,存放括号的映射关系
有括号要匹配左括号,所以我们的映射关系为: ) -> ( 、 ] -> [ 、 }-> {
-
维护stack:后进先出的特性
-
逐位遍历str,如果当前char在map中,说明必须要判断,stack此时的top是否为其匹配的括号,并pop掉,如果不匹配,直接返回fase即可
这里要注意如果stack为空的情况
-
如果当前char在map中,则入栈
-
全部字符遍历完成后,返回true
关键代码
public boolean isValid(String s) {
if (s.length() % 2 != 0) 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为空的情况
char pop = stack.isEmpty() ? '#' : stack.pop();
if (map.get(c) != pop) {
return false;
}
} else {
stack.push(c);
}
}
// 最后如果stack是空的 说明都匹配到了,返回true
return stack.isEmpty();
}
该博客讨论了如何判断一个包含'(', ')', '[', ']', '{', '}
766

被折叠的 条评论
为什么被折叠?



