咸鱼学算法No.2-20.有效的括号

117 阅读2分钟

努力坚持尽量别忘了打卡, leetcode 20有效的括号,难度:easy

一、题目描述

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。 示例 1:
输入: s = "()"
输出: true

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

提示:

  • 1 <= s.length <= 104
  • s 仅由括号 '()[]{}' 组成

二、解题思路

这次依然参考了官方解法,使用栈的思想去解题,该说不说,还是学到了东西的! 大家要先理解栈这个概念,先进后出

  1. 先进行一个判断,如果括号有效那么字符长度一定为偶数
  2. 使用Map 来构建一个键值对,key为右括号,值为左括号(没反应过来的,先往下看)
  3. 遍历字符串,先判断字符是否为右括号不是则把它放入栈中
  4. 当字符为右括号时,我们先判断是否为空,取的最后一位 去和Map的键值作比较,不同则证明括号不匹配,相同则 将其从栈中移除
  5. 最终 栈空既全部匹配(因为每次匹配全时,会有个匹配项从栈中移除),不空则证明有不匹配的项

三、代码

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
  // 括号成对 长度必是偶数
  if(s.length % 2 != 0) return false
  const pairs = new Map([
    [')', '('],
    [']', '['],
    ['}', '{']
  ]);
  let result = []
  // 利用栈的 思路解题  先进后出
  for(let str of s) {
    if(pairs.has(str)) {
      // 当栈空 或者 当前项与pairs中的不匹配时 
      if(!result.length || result[result.length - 1] != pairs.get(str)) {
        return false
      }
      // 有匹配的 栈中移除匹配项
      result.pop()
    } else {
      // 放入栈中
      result.push(str)
    }
  }
  // 栈空 既全部匹配,栈有剩余 则证明有不匹配的括号
  return !result.length
};

四、反思一下(大白话时间)

反思一下,第一次讲栈的概念落地,这道题是个easy 题,对栈有一定理解的,再来做这道题对于刚入手的人还是挺友好的,写这篇文章的概念就是想复盘一下这个做题思路,因为参考了官方的做法嘛,要验证一下自己吸收了没有。

整挺好,加油!