[路飞]有效的括号

133 阅读1分钟

题目描述

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

有效字符串需满足:

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

分析

输入:String, 由括号组成的字符串
输出:Boolean, 表示字符串里的括号是否可以正确闭合

解题思路

题目要求检查字符串里的括号是否闭合,我们的核心思路则是:遍历到的右括号是否可以和左括号闭合

具体而言,如果当前遍历到的是右括号,则需要检查前边是否有一个左括号和它闭合,如果没有,那么整个字符串不合格,返回 false

因此,我们需要把遍历到的左括号放到一个栈里,在遍历到又括号的时候从栈中弹出一个,检查是否可以闭合,如果可以,则继续检查。

代码


/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
  const stack = []
  const map = new Map([
    ["(", ")"],
    ["[", "]"],
    ["{", "}"],
  ])

  for (const c of s) {
    if (map.has(c)) {
      stack.push(c)
    } else {
      if (map.get(stack.pop()) !== c) return false
    }
  }

  return !stack.length
}

复杂度

时间:O(N),需要遍历字符串 空间:O(N),需要栈去存储所有的左括号,最坏情况,字符串全是左括号