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 @ 2021-06-02 14:18  你也要来一颗长颈鹿吗  阅读(33)  评论(0)    收藏  举报