[路飞] 27——leetcode - [20] 有效的括号

138 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

20. 有效的括号

题目分析

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

有效字符串需满足:

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

思路讲解

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

有效字符串需满足:左括号必须用相同类型的右括号闭合。左括号必须以正确的顺序闭合。

  • 遍历给字符串s。 当遇到一个左括号,希望在后面的字符中,有一个相同类型的右括号将其闭合。
  • 当遇到一个右括号时,就可以去出栈顶的左括号,判断两个括号是否能闭合。如果不是相同类型的括号或者栈中没有括号,我们这个字符串就是无效的。
  • 为了能快速的判断括号的类型,我们可以创建一个Map。 创建一个栈stack来存储我们的左括号。
  • 最后开始遍历我们的字符串
    • 如果是左括号,我们就将该字符加入到栈中
    • 如果是右括号,判断栈顶的元素和当前的元素是否能完全闭合

示例

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

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

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

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

代码

/*
 * @lc app=leetcode.cn id=20 lang=javascript
 *
 * [20] 有效的括号
 */

// @lc code=start
/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function (s) {
  // 定义一个栈
  let stack = []
  // 使用map设置好映射关系
  let map = new Map([
    [')', '('],
    [']', '['],
    ['}', '{']
  ])
  // 遍历s
  for (ch of s) {
    if (map.has(ch)) {
      // 如果包含
      // 需要判断栈是否空了, 或者从map中取出的映射值不等于栈顶元素, return false
      if (!stack.length || map.get(ch) !== stack[stack.length - 1]) {
        return false
      }
      // 否组表示配对成功,需要把栈顶元素弹出
      stack.pop()
    } else {
      stack.push(ch) // 如果不包含,就存到栈里
    }
  }
  return !stack.length // 如果stack为空,表示所有元素都弹出了,都匹配上了
};
// @lc code=end