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;
    }
}
相关推荐
SamDeepThinking几秒前
并发量就算只有2,该上锁还得上呀
java·后端·架构
Sam_Deep_Thinking16 分钟前
如何让订单系统和营销系统解耦
java·架构·系统架构
lzhdim37 分钟前
SQL 入门 12:SQL 视图:创建、修改与可更新视图
java·大数据·服务器·数据库·sql
科研前沿1 小时前
镜像孪生VS视频孪生核心技术产品核心优势
大数据·人工智能·算法·重构·空间计算
水蓝烟雨1 小时前
1931. 用三种不同颜色为网格涂色
算法·leetcode
晨曦夜月1 小时前
map与unordered_map区别
算法·哈希算法
Morwit1 小时前
QML组件之间的通信方案(暴露子组件)
c++·qt·职场和发展
FQNmxDG4S1 小时前
Maven依赖管理:版本冲突解决与生命周期控制
java·数据库·maven
图码2 小时前
如何用多种方法判断字符串是否为回文?
开发语言·数据结构·c++·算法·阿里云·线性回归·数字雕刻
傻瓜搬砖人2 小时前
Spring集成Web环境
java·spring·maven