leetcode20 有效的括号 javascript解题

本题连接 leetcode-cn.com/problems/va…
这道题要用到栈这个数据结构去解题。有小括号,中括号和大括号三种括号,每种括号有左和右两种形态,左右括号要匹配才合法。咱们的思路以下步骤:程序员

  • 把字符串中的括号依次入栈,若是是左括号就正常入栈,若是是右括号,就要和前一个入栈的左括号去作比较。因此第一个入栈的是右括号的话确定返回false。
  • 若是不是同一类型的括号,不能匹配,就直接返回false。
  • 若是都是同一类型的括号,就能够匹配,那么这一对匹配了的括号就出栈。
  • 继续入栈括号,按照上面的规则去作匹配,直到最后一个括号入栈完。
  • 若是全部的括号都匹配了且最后栈里面的元素为空,那么就返回true,其余状况都返回false。

分析一下时间复杂度,每个元素都要入栈一次,因此时间复杂度是o(n)算法

思路理清楚了,咱们开始写代码:bash

var isValid = function(s){
    let stack = [];
    for(let item of s){
        // 左括号正常入栈
        if(item === '(') stack.push(')');
            else if(item === '[') stack.push(']');
            else if(item === '{') stack.push('}');
        else {  // 右括号
            // 第一个字符就是右括号的状况
            if (stack.length === 0) return false ;
            // 栈顶的左括号与右括号作匹配
            if (stack.pop() !== item) return false;
        }
    }
    // 最后栈里的元素要为空才返回true
    return !stack.length;
}
复制代码

最终顺利经过,一样的思路,咱们换一种写法:数据结构

var isValid = function(s){
    let stack = [];
    let map = {
        '(':')',
        '[':']',
        '{':'}'
    };
    for( let i=0; i<s.length; i++ ){
        let cur = s[i];
        if(map[stack[stack.length - 1]] === cur) stack.pop();;
        else stack.push(cur);
    }
    return !stack.length;
}
复制代码

第二种方法是社区大佬写的,很是巧妙。用一个对象将配对的括号经过键值对存储起来,让代码更简洁,小弟现阶段只能仰望。ui

总结

作算法题必定要先把思路理顺了再去写,作这道题加写这篇文章我整整花了两个多小时,就是由于一拿到题就开始写,没有去分析,中间浪费了大量的时间在发呆、迷茫上面。leetcode真恐怖,这还只是简单难度,两天作一道leetcode可能要成为一个flag了。作一个程序员真难🙂spa

相关文章
相关标签/搜索