用JavaScript刷leetcode第20题-有效的括号

222 阅读2分钟

前言

第一次遇见她时,我没有穿西服,没打领带,只背着VSCode。
我手里只有hash表和栈,身无分文,我该如何征服她?
我思来想去,决定以哈希表为西服,以栈为领带,来一次cosplay。
好了,编不下去了。其实我是在刷leetcode第20题-有效的括号, 女人只会影响我拔刀的速度

一、题目描述

leetcode地址
给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。
有效字符串需满足:
左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。

二、遇见坑我

我是不会告诉你们,坑我就是坑爹。

  • 在第一次提交答案的时候,我没有考虑到一个地方,遇见右括号栈为空的情况

三、解题思路

  • 括号数目不为偶,就应该停止不前了
  • 后遇到的括号应该先闭合,故用栈
  • 括号的左右对应关系用哈希表存
  • 遇到左括号压栈
  • 遇到右括号出栈,但是这里要注意判定下栈是否为空

四、代码

注释已经很详细了,但是你们千万不要昧着良心说 “兄弟这波操作细啊”
git代码地址

const isValid = function (s) {
  // 如果左右括号数总数为奇数,说明肯定不是有有效括号
  if(s.length % 2 !== 0) return false

  // 用栈,后遇到的左括号用先闭合, 符合后进先出
  const stack = []

  // 左右括号对应,描述闭合关系
  const hashMap = new Map([
    [')', '('],
    [']', '['],
    ['}', '{']
  ])

  // 遍历传入字符, 遇到左括号压栈,遇到右括号,若栈为空,则返回false, 若栈顶元素不是对应左括号,返回false
  for(let val of s) {
    // if 里面是遇见右括号, else 里是遇见左括号
    if(hashMap.has(val)) {
      // 遇见右括号,栈为空,返回false
      if(stack.length < 0) return false
      // 栈不为空,出栈,若不是有效闭合,返回false
      const left = stack.pop()
      if(left !== hashMap.get(val)) return false
    } else { 
      // 遇见左括号,进栈
      stack.push(val)
    }
  }

  // 遍历结束后,栈不为空则说明不是有有效括号,为空则说明是有有效括号
  return stack.length === 0
}