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;
    }
}
相关推荐
努力学算法的蒟蒻9 分钟前
day35(12.16)——leetcode面试经典150
算法·leetcode·面试
cheems952712 分钟前
锁策略的介绍
java·开发语言
cccc来财16 分钟前
角点检测算法:Harris 和 FAST 方法
算法·计算机视觉·特征提取
武子康17 分钟前
Java-199 JMS Queue/Topic 集群下如何避免重复消费:ActiveMQ 虚拟主题与交付语义梳理
java·分布式·消息队列·rabbitmq·activemq·mq·java-activemq
风中月隐21 分钟前
C语言中以坐标的方式图解“字母金字塔”的绘制
c语言·开发语言·算法·字母金子塔·坐标图解法
q_302381955623 分钟前
告别“笨重”检测!VA-YOLO算法让疲劳驾驶识别更轻更快更准
算法·yolo
LSL666_24 分钟前
12 MyBatis的连接池
java·服务器·mybatis
Arva .26 分钟前
说说线程的生命周期和状态
java·开发语言
tryxr34 分钟前
HashTable、HashMap、ConcurrentHashMap 之间的区别
java·开发语言·hash
松涛和鸣35 分钟前
DAY32 Linux Thread Programming
linux·运维·数据库·算法·list