Leetcode前端必会系列:有效的括号

63 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第1天,点击查看活动详情

引言

算法的技能对于程序员是百益而无一害,作为程序员无论是前端还是后端算法技能对于我们都是十分十分的重要,我将陆续整理并讲解前端程序员必须掌握的经典算法。

题目描述

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

输入: s = "(]"
输出: false

分析

根据题目的分析,我们知道题目需要完成括号匹配的判断。根据题目设计的规则,我们可以基于栈的数据结构完成题目的解决,逐个的通过入栈和出栈的对比操作完成。

  1. 创建一个栈保存结果
  2. 遍历字符串
  3. 如果是左边的括号,入栈
  4. 如果是右边的括号,出栈一个元素对比是否匹配
  5. 遍历结束,如果栈是空返回true,否则返回false

解答

   var isValid = function(s) {

  //有效的括号

  let res = []

  for(let i=0;i<s.length;i++) {

    if(s[i]==='(' || s[i]==='[' || s[i]==='{') res.push(s[i])

    else {

      if(!res.length) return false

      //1.出栈一个

      let ele = res.pop()

      if(ele==='(' && s[i]!==')' || ele==='[' && s[i]!==']' || ele==='{' && s[i]!=='}')

        return false

    }

  }

  if(!res.length) return true

  return false

};

由于设计是栈数据结构,通过分析知:算法的时间复杂度是o(n)。空间复杂度是o(n)。整体设计思路还是比较简洁容易的。

总结

通过对有效的括号题目的讲解,大家学到了如何利用栈进行问题的解决。栈数据结构巧妙计算可以优雅的在低时间和空间复杂度下完成任务。