LeetCode20 有效的括号

题目

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

有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:
输入:s = "()"
输出:true

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

示例 3:
输入:s = "(]"
输出:false

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

示例 5:

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

提示:

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

方法

1.辅助栈法

用hashmap保存模板,然后依次放入栈中,用栈判断顺序

  • 时间复杂度:O(n)
  • 空间复杂度:O(n+m),m为模板数量
Java版本:
class Solution {
    public boolean isValid(String s) {
        if(s.length()<=0){
            return true;
        }
        Map map = new HashMap();
        map.put('}','{');
        map.put(']','[');
        map.put(')','(');
        Stack stack = new Stack();
        for(char c:s.toCharArray()){
            if(!stack.isEmpty()&&map.get(c)==stack.peek()){
                stack.pop();
            }else{
                stack.push(c);
            }
        }
        if(stack.isEmpty()){
            return true;
        }
        return false;
    }
}
Js版本:
var isValid = function(s) {
    const n = s.length;
    if(n%2===1) return false;
    const map = new Map([
        [")","("],
        ["]","["],
        ["}","{"]
    ]);
    const stack = [];
    for(let ch of s){
        if(map.has(ch)){
            if(!stack.length||stack[stack.length-1]!==map.get(ch)){
                return false;
            }
            stack.pop();
        }else{
            stack.push(ch);
        }
    }
    return !stack.length;
};

2. 替换法

依次替换掉字符串中的()、{}和[]

  • 时间复杂度:O(n)
  • 空间复杂度:O(1)
Java版本:
class Solution {
    public boolean isValid(String s) {
        int length = s.length() / 2;
        for (int i = 0; i < length; i++) {
            s = s.replace("()", "").replace("{}", "").replace("[]", "");
        }
        return s.length() == 0;
    }
}
Js版本:
var isValid = function(s) {
    const n = s.length /2;
    for(let i=0;i<n;i++){
        s = s.replace("()","").replace("{}","").replace("[]","");
    }
    return !s.length;
};
posted @   你也要来一颗长颈鹿吗  阅读(25)  评论(0编辑  收藏  举报
编辑推荐:
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
阅读排行:
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
点击右上角即可分享
微信分享提示