简单
题目描述
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入: s = "()"
输出: true
示例 2:
输入: s = "()[]{}"
输出: true
示例 3:
输入: s = "(]"
输出: false
示例 4:
输入: s = "([])"
输出: true
提示:
1 <= s.length <= 104s仅由括号'()[]{}'组成
思路
这道题乍一看想用双指针,但是想了想还是用栈。提到栈,前两天咱们刚好总结了现在版本的Java是用Deque全面替代Stack了,而且还总结好了Deque的一些方法。其中还分为“安全”和“危险”的方法。
快速的总结一下吧:
// 安全的:
offer() / offerLast()
poll() / pollFirst()
peek()
// 抛异常的
addFirst()
removeFirst()
getFirst()
如果想和以前的Stack操作一模一样的话,建议使用 push() / pop() / peek()的组合。
实现:
class Solution {
public boolean isValid(String s) {
Deque<Character> s1 = new ArrayDeque<>(); // ArrayDeque or LinkedList
for (char c: s.toCharArray()) {
if (c == '(' || c == '{' || c == '[') {
s1.push(c);
} else {
if (s1.peek() == null) {
return false;
}
}
if (c == '}') {
if (s1.peek() != '{') {
return false;
} else {
s1.pop();
}
}
if (c == ')') {
if (s1.peek() != '(') {
return false;
} else {
s1.pop();
}
}
if (c == ']') {
if (s1.peek() != '[') {
return false;
} else {
s1.pop();
}
}
}
return s1.isEmpty();
}
}
思路其实很简单,就是简单的栈的应用。但是我看到更优雅的写法,我给记录如下:
class Solution {
public boolean isValid(String s) {
Deque<Character> stack = new LinkedList<>();
for (char c : s.toCharArray()) {
if (c == '{') {
stack.push('}');
} else if (c == '[') {
stack.push(']');
} else if (c == '(') {
stack.push(')');
} else {
if (!stack.isEmpty() && c == stack.pop()) {
continue;
} else {
// empty stack or value not match
return false;
}
}
}
return stack.isEmpty();
}
}
这个更优雅的写法而且还更快。需要解释的评论区咱们讨论一下哈。