js算法题解(第十五天)---20. 有效的括号

310 阅读3分钟

「这是我参与2022首次更文挑战的第16天,活动详情查看:2022首次更文挑战

前言

每天至少一道算法题,死磕算法

链表的题目咱们告一段落,今天我们开始栈和队列题目

栈和队列的数据结构想必大家都有所了解,在这里我就不抖书包了,直接来个题让大家感受一下

题目

这是leetcode上的第20道题目20. 有效的括号

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

示例 1:

输入:s = "()"
输出:true

示例 2:

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

思路

第一步:从题目中提取关键词

  • 1.左括号必须用相同类型的右括号闭合。这句话的意思就是要对称
  • 2.左括号必须以正确的顺序闭合。这句话是精髓呀,什么是正确的顺序闭合,就是左括号出现的顺序必须和闭合的顺序是对称的,比如[()]是正确的顺序,([)]这种闭合顺序不对称,就不是正确的顺序闭合,这不正符合栈数据结构的后进先出的特征么,这都明确的提醒你了,要用栈来解题,就差扯着嗓子和你喊了

第二步:技巧 1.解答对称性的这类题目,我们应该首先想到栈,根据栈的后进先出原则,一组数据的入栈和出栈顺序刚好是对称的。 2.括号类的问题,我们都可以往栈上想

第三步:分析 1.第一步先考虑特殊情况问题,有没有可能为空呀,是有可能为空的 2.题中给的有效括号,我们要保存起来,要不没法识别,因为是对称的,所以我们用object保存

   let object = {
         "(":")",
         "[":"]",
         "{":"}",
     };

3.我们模拟一个栈结构,

  • 如果是object的key,那么入栈key的value值
  • 如果不是object的key
    • 如果栈顶和元素匹配,那么出栈
    • 如果栈顶和元素不匹配,那么直接返回false 4.循环结束以后,如果stack没有值,那么返回true,如果有值,那么返回false

题解

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    // 首先保存起来要用的括号
     let object = {
         "(":")",
         "[":"]",
         "{":"}",
     };
     // 模拟栈结构
     let stack=[];   
     for(let i=0;i<s.length;i++){
         let cur = s[i];
         //如果是object的key,那么入栈key的value值
         if(object[cur]){
             stack.push(object[cur]);
             //如果栈顶和元素匹配,那么出栈
         }else if(stack[stack.length-1]===s[i]){
             stack.pop();
         }else{
             // 如果栈顶和元素不匹配,那么直接返回false
             return false;
         }
     }
    // 遍历结束以后,看stack是否为空,有值返回false,无值返回true
    return !stack.length;

};

看一下执行的时间还不错

图片.png

总结

玩转栈的算法题,一定要先了解栈的数据结构,栈的数据结构就像冰箱一样,元素就是雪糕,我们后放进去的雪糕,先拿出来,先放进去的后拿出来。大家要多发挥自己的想象力,把未知的知识,去和已知的知识建立联想

参考