大家好!我是曾续缘😊
今天是《LeetCode 热题 100》系列
发车第 69 天
栈第 1 题
❤️点赞 👍 收藏 ⭐再看,养成习惯
给定一个只包括
'('
,')'
,'{'
,'}'
,'['
,']'
的字符串s
,判断字符串是否有效。有效字符串需满足:
- 左括号必须用相同类型的右括号闭合。
- 左括号必须以正确的顺序闭合。
- 每个右括号都有一个对应的相同类型的左括号。
示例 1:
输入:s = "()" 输出:true示例 2:
输入:s = "()[]{}" 输出:true示例 3:
输入:s = "(]" 输出:false提示:
难度:❤️
1 <= s.length <= 104
s
仅由括号'()[]{}'
组成
解题方法
栈提供了后进先出(LIFO)的特性,这正好符合括号匹配的规则。我们使用栈来解决这个问题。在遍历字符串的过程中,我们会将左括号压入栈中,然后当遇到右括号时,我们将检查栈顶的左括号是否能够与当前的右括号匹配。如果能够匹配,则将栈顶的左括号弹出,否则返回 false。
Code
查看代码
java
class Solution {
public boolean isValid(String s) {
Stack<Character> left = new Stack<>(); // 创建一个字符类型的栈
for (int i = 0; i < s.length(); i++) { // 遍历字符串
if (s.charAt(i) == '(' || s.charAt(i) == '[' || s.charAt(i) == '{') { // 如果是左括号,压入栈中
left.push(s.charAt(i));
} else { // 如果是右括号
if (left.empty())
return false; // 如果栈为空,说明没有与之匹配的左括号,返回 false
if ((left.peek() == '(' && s.charAt(i) == ')') || // 检查栈顶的左括号与当前右括号是否匹配
(left.peek() == '[' && s.charAt(i) == ']') ||
(left.peek() == '{' && s.charAt(i) == '}')) {
left.pop(); // 如果匹配,弹出栈顶的左括号
} else {
return false; // 如果不匹配,返回 false
}
}
}
return left.empty(); // 最终检查栈是否为空,如果为空,说明所有左括号都找到了匹配的右括号,返回 true;否则返回 false
}
}