数据结构-20. 有效的括号

87 阅读1分钟

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();
    }
}

四、总结:

image.png

掘友们,解题不易,留下个赞或评论再走吧!谢啦~ 💐