LeetCode 算法题【简单】20. 有效的括号

语雀博客原文链接

文章目录

1、LeetCode 链接

plain 复制代码
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
每个右括号都有一个对应的相同类型的左括号。
 

示例 1:

输入:s = "()"

输出:true

示例 2:

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

输出:true

示例 3:

输入:s = "(]"

输出:false

示例 4:

输入:s = "([])"

输出:true

示例 5:

输入:s = "([)]"

输出:false

 

提示:

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

2、个人写法

  • 思路:有效字符串从左到右遇到的第一个右括号,它的上一个字符肯定是对应的左括号
  • 时间复杂度:O(N)
  • 空间复杂度:O(N)
plain 复制代码
class Solution {
    public boolean isValid(String s) {

        int length = s.length();
        Stack<Character> stack = new Stack();
        for (int i = 0; i < length; i++) {
            char c = s.charAt(i);
            if (c == '(' || c == '[' || c == '{') {
                stack.add(c);
            } else {
                if (stack.empty()) {
                    return false;
                }
                switch (c) {
                    case ')':
                        if (stack.peek() == '(') {
                            stack.pop();
                        } else {
                            return false;
                        }
                        break;
                    case ']':
                        if (stack.peek() == '[') {
                            stack.pop();
                        } else {
                            return false;
                        }
                        break;
                    case '}':
                        if (stack.peek() == '{') {
                            stack.pop();
                        } else {
                            return false;
                        }
                        break;

                }
            }
        }

        return stack.size() == 0;

    }
}

3、官方写法

  • 思路:在上述基础上做了点优化,避免重复判断,复杂度没变
  • 时间复杂度:O(N)
  • 空间复杂度:O(N)
plain 复制代码
class Solution {
    public boolean isValid(String s) {

        int length = s.length();
        Stack<Character> stack = new Stack();

        Map<Character, Character> map = new HashMap();
        map.put(')', '(');
        map.put(']', '[');
        map.put('}', '{');
        for (int i = 0; i < length; i++) {
            char c = s.charAt(i);
            if (map.containsKey(c)) {
                if (stack.empty() || stack.peek() != map.get(c)) {
                    return false;
                }
                stack.pop();
            } else {
                stack.add(c);
            }
        }
        return stack.size() == 0;
    }
}
相关推荐
liang_jy4 小时前
文件管理(一)—— 初识文件管理
面试·操作系统
liang_jy5 小时前
文件管理(二)—— 文件结构
面试·操作系统
小Ti客栈5 小时前
Spring Boot 集成 Springdoc-OpenAPI 与 Knife4j实现接口文档与可视化调试
java·spring boot·后端
徐小夕5 小时前
花了一周,3亿tokens,我开源了一款 Word 文档智能审查平台,文稿自动质检+可视化分析,告别低效人工审核
前端·算法·github
Ai拆代码的曹操5 小时前
Spring 事务 REQUIRES_NEW 嵌套调用:连接池翻倍的秘密
java·后端·spring
动恰客流统计6 小时前
ReID边缘计算视觉统计:餐饮店客流增长的数字化破局路径
java·大数据·运维·人工智能
可编程芯片开发6 小时前
UPFC统一潮流控制器的simulink建模与仿真
算法
Ivanqhz7 小时前
Rust &‘static str浅析
java·前端·javascript·rust
小小仙子7 小时前
矢量网络分析仪如何测试S参数的?
人工智能·算法·机器学习