有效的括号 | Java刷题打卡

483 阅读1分钟

本文正在参加「Java主题月 - Java 刷题打卡」,详情查看 活动链接

缘聚缘散缘如水,背负万丈尘寰,只为一句,等待下一次相逢。
文章首发于公众号 “蘑菇睡不着”,更多精彩内容欢迎关注

一、题目描述

给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:

  • 左括号必须用相同类型的右括号闭合。
  • 左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

输入:s = "()[]{}"
输出:true

示例 3:

输入:s = "(]"
输出:false

示例 4:

输入:s = "([)]"
输出:false

示例 5:

输入:s = "{[]}"
输出:true 

提示:
1 <= s.length <= 104
s 仅由括号 '()[]{}' 组成

二、思路分析:

  这道题的就是讲括号成对成对匹配,这个可以借助数据结构 来实现,栈 的特点是先进后出,咱们先遍历字符串,将括号对左侧压入栈中,当遇到不是括号对左侧的就弹出栈的最顶元素,如果能匹配成括号对,那么就继续遍历,匹配不上代表不符合条件。

三、AC代码

class Solution {
    public static boolean isValid(String s) {
        // 如果为空,或者长度小于2,或者长度不是偶数 都不符合条件 
        if (s == null || s.length() < 2 || s.length() % 2 != 0) {
            return false;
        }
        // 预先存储 括号对
        Map<Character, Character> map = new HashMap<>();
        map.put(']', '[');
        map.put(')', '(');
        map.put('}', '{');
        Stack<Character> stack = new Stack<>();
        for (char c : s.toCharArray()) {
            // 如果碰到的是右括号 
            if (map.containsKey(c)) {
            // 如果栈为空,并且不能和栈弹出的括号相匹配,不符合条件
                if (stack.isEmpty() || stack.pop() != map.get(c)) {
                    return false;
                }
            } else {
                // 否则压入栈 
                stack.push(c);
            }
        }
        return stack.isEmpty();
    }

    public static void main(String[] args) {
        System.out.println(isValid("()"));
    }
}

时间复杂度:O(n),其中 n 是字符串的长度,要遍历一次字符串
空间复杂度:O(n + 6),n 是栈存储的空间,存储 n 个字符,6 是map中存储的字符。

四、总结

  这道题难点就是选择正确的数据结构,正确的数据结构能够事半功倍。

如果觉得文章还不错就点个赞、关个注呗~