问题
给定一个只包括 '('
,')'
,'{'
,'}'
,'['
,']'
的字符串 s
,判断字符串是否有效。
有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true
示例 2:
输入:s = "()[]{}" 输出:true
示例 3:
输入:s = "(]" 输出:false
提示:
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
解题思路
- 初始化栈
- 在
isValid
方法开始时,我们创建了一个Stack<Character>
的实例来存储尚未匹配的左括号。
- 在
- 遍历字符串
- 使用增强的
for
循环遍历字符串s
中的每个字符。
- 使用增强的
- 处理左括号
- 如果当前字符是左括号(
(
、[
、{
),则将其推入栈中。这是因为我们还没有找到与之匹配的右括号,所以我们需要暂时存储它。
- 如果当前字符是左括号(
- 处理右括号
- 如果当前字符是右括号(
)
、]
、}
),则执行以下步骤:- 检查栈是否为空:如果栈为空,说明没有左括号可以与之匹配,因此字符串无效,返回
false
。 - 获取栈顶元素:使用
stack.pop()
方法弹出栈顶的左括号,并将其存储在变量topChar
中。 - 比较括号类型:根据当前右括号的类型,检查它是否与栈顶弹出的左括号匹配。如果不匹配,说明括号无效,返回
false
。
- 检查栈是否为空:如果栈为空,说明没有左括号可以与之匹配,因此字符串无效,返回
- 如果当前字符是右括号(
- 检查栈是否为空
- 在遍历完整个字符串后,我们检查栈是否为空。如果栈为空,说明所有左括号都找到了匹配的右括号,因此字符串是有效的,返回
true
。如果栈不为空,说明有未匹配的左括号,字符串无效,但在这个特定的解决方案中,由于我们在遇到右括号时已经进行了匹配检查,所以理论上在遍历结束时栈应该为空。
- 在遍历完整个字符串后,我们检查栈是否为空。如果栈为空,说明所有左括号都找到了匹配的右括号,因此字符串是有效的,返回
- 匹配规则
- 匹配规则很简单:左小括号
(
与右小括号)
匹配,左方括号[
与右方括号]
匹配,左大括号{
与右大括号}
匹配。
- 匹配规则很简单:左小括号
import java.util.Stack;
class Solution {
public boolean isValid(String s) {
Stack<Character> stack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '(' || c == '[' || c == '{') {
stack.push(c);
} else if (c == ')' || c == ']' || c == '}') {
if (stack.isEmpty()) {
return false; // 没有左括号与之匹配
}
char topChar = stack.pop();
if (c == ')' && topChar != '(') {
return false;
}
if (c == ']' && topChar != '[') {
return false;
}
if (c == '}' && topChar != '{') {
return false;
}
}
}
return stack.isEmpty(); // 如果栈为空,说明所有括号都正确匹配
}
}