问题
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
思路
- 需要使用 栈 这个数据结构。
- 匹配时,可以用上map。
- 最基本的长度判断优化。
- 只有当最后栈是空的才是匹配的。
public static boolean isValid(String s) {
int n = s.length();
if (n % 2 == 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 < n; i++) {
char temp = s.charAt(i);
if (!map.containsKey(temp)) {
stack.push(temp);
} else {
if (stack.isEmpty() || stack.pop() != map.get(temp)) {
return false;
}
}
}
return stack.isEmpty();
}
需要注意的是,上面使用的是 Character 。leet-code代码执行耗时1ms,优过97%的提交代码。
如果Map和Stack中使用String的话,会很慢。耗时是4ms,仅有过9%。可以对比试试。
public boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {
return false;
}
Map<String, String> map = new HashMap<>();
map.put(")", "(");
map.put("]", "[");
map.put("}", "{");
Stack<String> stack = new Stack<>();
for (int i = 0; i < n; i++) {
String temp = s.charAt(i) + "";
if (!map.containsKey(temp)) {
stack.push(temp);
} else {
if (stack.isEmpty() || !stack.pop().equals(map.get(temp))) {
return false;
}
}
}
return stack.isEmpty();
}
- 时间复杂度:O(n)
- 空间复杂度:O(n)
硬广告
欢迎关注公众号:double6