力扣刷题-括号配对问题-javascript基础算法题1

题目:

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

有效字符串需满足:

1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.每个右括号都有一个对应的相同类型的左括号

 

来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/valid-parentheses
 

解题思路:

用js 中的标准内置对象,Map(),使用map.set()把'{}' '[]' '()' 以键值对的形式,放入map中,

对于字符串s的每一个字符(这些字符只能是{} [] () 组成),都要配对上他的另外一边,通过观察,

我们不难发现要想以正确的形式配对成功,我们应该用 stack (也就是我们常说的栈,他是一个遵循 ”先进后出“ 原则的容器 ) ,若对于s 中的字符,是map 的键,就把值推入栈中;若不是map的键,(题目中有描述,s 仅由 ‘(){} [ ]’ 组成),则从 栈中弹出一个(也就相当于是数组最后一个元素),进行 比较。(后面的就比较简单了,大家自行看代码理解,同时,我有什么写得不对的地方,也欢迎大家在评论区留言)

步骤:

  1. 创建一个map, 把使用map.set()把'{}' '[]' '()' 以键值对的形式,放入map中
  2. 创建栈,用for 循环遍历字符串 s, 比较每一个字符,属于键的,把他的对应的值,也就是配对的右边,推入栈中, arr.push(a), 不属于键,则将其与栈中的最后一个元素比较,相等,则arr.pop() 推出栈,不相等 return false ; 匹配失败。
  3. 循环结束,我们还要考虑一种情况,s = '[ {} ] ('    这种奇数个的,也是匹配失败的。 if 判断栈是否为空,不为空,则 return false.

代码:

var isValid = function(s) {
     const map1 = new Map();
            map1.set('{','}');
            map1.set('[',']');
            map1.set('(',')');

            let stack = [];
            //字符串的循环
            for (const item of s) {
                if(map1.has(item)){
                    stack.push(map1.get(item));
                    //这一步把匹配的值推入这个栈中
                }else{
                    //与最后一个比的原因是,栈的先进后出,同时,括号匹配,也是匹配右括号匹配没有配对成功的离自己最近的左括号
                      if(item === stack[stack.length-1]){
                        stack.pop();
                        //第一个出栈
                    }else{
                        return false;
                    }
                }
            }
            //对栈判空,数组长度大于0 ,代表栈不为空
            if(stack.length > 0){
                return false;
            }
             return true;  
};

最后:

求赞,求关,永远爱你哦!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值