算法:力扣的有效的括号js版

3,614 阅读2分钟

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。 注意空字符串可被认为是有效字符串。

解题思路: 第一种:用repace方法,闭合才有效,也就是最里边的也要闭合,那就把最里边的括号取代为空

var isValid = function(s) {
    while(s.length){
        let temp =s;
        s = s.replace('()','');
        s = s.replace('[]','');
        s = s.replace('{}','');
        if(s==temp)return false
    }
    return true
};

第二种:栈思想 括号都是要闭合的,也就是说遇到第一个右括号时,必定左边就是对应的左括号,也就是说把遇到的左括号都放进栈里,然后遇到右括号时取出栈顶的元素匹配 如"{[()]}"遇到{[(放入栈内,然后遇到)与栈顶匹配,栈顶也就是最后一个进栈的元素(,然后把栈的最后一个元素删掉

var isValid = function(s) {
    let a = [];
    let res=0;
    for(let i=0;i<s.length;i++){
        if(s[i]=='('||s[i]=='{'||s[i]=='['){
            a.push(s[i]);
            res++;
        }
        else if(s[i]==')'){
            if(a[a.length-1]=='('){
               a.pop();
                res--;
            }
            else return false
        }
        else if(s[i]=='}'){
            if(a[a.length-1]=='{'){
               a.pop();
                res--;
            }else return false
        }
        else if(s[i]==']'){
            if(a[a.length-1]=='['){
               a.pop();
                res--;
            }else return false
        }
    }
    return res==0
};

比起第一个方法快了不少但是还是慢 第三种:使用map数据结构

var isValid = function(s) {
    let map = {
        "{":"}",
        "[":"]",
        "(":")",
    }
    let leftArr = [];
    for(let ch of s){
        if(ch in map){
            leftArr.push(ch)
        }else{
            if(ch!=map[leftArr.pop()]){
                return false
            }
        }
    }
     return !leftArr.length
};

循环s字符串,ch in map 的意思是循环map的键值,也就是遇到左括号时,放进数组,当开始遇到右括号时,用pop()弹出栈顶的元素与与之比对,若是不相等,就ruturn false (leftArr.pop()为左括号,map[key]=value,也就是右括号),当程序走完时,left的length长度应该为0,若不为0则没闭合(当length=0 时,!leftArr.length为turn,当length>0 时,!leftArr.length为false)