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;
    }
}
相关推荐
牛奶5 小时前
Vue 基础理论 & API 使用
前端·vue.js·面试
牛奶5 小时前
Vue 底层原理 & 新特性
前端·vue.js·面试
NAGNIP6 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
青青家的小灰灰11 小时前
深入理解事件循环:异步编程的基石
前端·javascript·面试
程序员清风13 小时前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林55114 小时前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
颜酱14 小时前
单调栈:从模板到实战
javascript·后端·算法
UrbanJazzerati17 小时前
Vue3 父子组件通信完全指南
前端·面试
UrbanJazzerati17 小时前
Vue 3 纯小白快速入门指南
前端·面试
CoovallyAIHub18 小时前
仿生学突破:SILD模型如何让无人机在电力线迷宫中发现“隐形威胁”
深度学习·算法·计算机视觉