栈与队列简单1 种解法
#20有效的括号
判断括号字符串是否按正确类型和嵌套顺序闭合。
#字符串#栈
解题主线
01
读到左括号时压入其期望的右括号,读到右括号时只需与栈顶比较。
解法 1:期望右括号栈
左括号入栈时直接压入匹配的右括号;右括号必须弹出相同字符。
时间复杂度
O(n)
空间复杂度
O(n)
java
import java.util.ArrayDeque;
import java.util.Deque;
final class Solution {
public boolean isValid(String s) {
if ((s.length() & 1) == 1) return false;
Deque<Character> expected = new ArrayDeque<>();
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '(' -> expected.push(')');
case '[' -> expected.push(']');
case '{' -> expected.push('}');
default -> {
if (expected.isEmpty() || expected.pop() != c) return false;
}
}
}
return expected.isEmpty();
}
}左括号入栈时直接压入匹配的右括号;右括号必须弹出相同字符。
- 合并两个同题文件,保留等价实现中状态最少的一种。
边界与易错点
- 奇数长度必不合法,可先排除。
- 栈必须是方法内局部变量;旧实现使用实例字段会让重复调用共享残留状态。
- ArrayDeque 比遗留的 Stack 和以 LinkedList 实现的栈更合适。
整理来源
由旧仓库源码复核、去重并整理;展示代码已按 Java 21 语义修正明显问题。
easy/Q020_isValid.javaeasy/Q020_isValidStr.java