Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情。
一、题目描述:
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
示例 1:
输入:s = "()" 输出:true 示例 2:
输入:s = "()[]{}" 输出:true 示例 3:
输入:s = "(]" 输出:false 示例 4:
输入:s = "([)]" 输出:false 示例 5:
输入:s = "{[]}" 输出:true
提示:
1 <= s.length <= 104 s 仅由括号 '()[]{}' 组成
来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va…
二、思路分析:
仔细分析我们发现,对于有效的括号,它的部分子表达式仍然是有效的括号,只要保证两个括号之间的括号是有效的,那么就算有效括号。即一对括号之间的括号都是闭合的。使用「栈」这一数据结构来解决。 具体过程如下: 遍历给定的字符串 s,将左括号依次放入栈顶。 当遇到第一个右括号时,我们可以取出栈顶的左括号并判断它们是否是相同类型的括号, 如果不是相同的类型,那么字符串 s 无效,返回 false, 如果时相同的类型,继续遍历,在遍历结束后,如果栈中没有左括号,说明我们将字符串 中的所有左括号闭合,返回 True,否则返回 False。
注意: 有效字符串的长度一定为偶数
三、AC 代码:
class Solution {
public boolean isValid(String s) {
int n = s.length();
if (n % 2 == 1) {
return false;
}
Map<Character, Character> pairs = new HashMap<Character, Character>() {{
put(')', '(');
put(']', '[');
put('}', '{');
}};
Deque<Character> stack = new LinkedList<Character>();
for (int i = 0; i < n; i++) {
char ch = s.charAt(i);
if (pairs.containsKey(ch)) {
if (stack.isEmpty() || stack.peek() != pairs.get(ch)) {
return false;
}
stack.pop();
} else {
stack.push(ch);
}
}
return stack.isEmpty();
}
}
四、总结:
掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐