[路飞]_一起刷leetcode 20. 有效的括号

「这是我参与11月更文挑战的第7天,活动详情查看:2021最后一次更文挑战

题目:

20. 有效的括号

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

有效字符串需满足:

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

 

示例 1:

输入: s = "()"
输出: true
复制代码

示例 2:

输入: s = "()[]{}"
输出: true
复制代码

示例 3:

输入: s = "(]"
输出: false
复制代码

示例 4:

输入: s = "([)]"
输出: false
复制代码

示例 5:

输入: s = "{[]}"
输出: true
复制代码

 

提示:

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

思路

  1. 首先,我们通过map对象建立好各个类型的左右括号之间的映射关系;

  2. 建立一个空数组stack,存放左括号;

  3. 遍历字符串,判断当前位置如果是左括号,就直接pushstack中;

  4. 当前位置如果是右括号,我们需要进行判断:

    (1) 前面是否有左括号;

    (2) 前面是的最后一个左括号是否与当前右括号配对;

  5. 如果满足条件,就从当前stack中删除最后一个元素,否则表示匹配失败,直接返回false

  6. 循环结束,判断是否有残留的左括号,没有的话证明匹配成功。

实现:

/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
    const n = s.length;
    // 先建立起对应关系
    let map = new Map();
    map.set("(", ")");
    map.set("{", "}");
    map.set("[", "]");

    let stack = [];
    for (let i = 0; i < n; i++) {
      let cur = s.charAt(i);
      // 判断是否左括号, 是的话直接入库,不是的话出库匹配
      if (map.has(cur)) {
          stack.push(cur);
      } else {
          let last = stack.pop();
          if (map.get(last) !== cur) {
              return false;
          }
      }
    }

    // 循环结束,说明没有不符合条件的情况, 这时候判断是否还有左括号没匹配即可
    return stack.length === 0;
};
复制代码

看懂了的小伙伴可以点个关注、咱们下道题目见。如无意外以后文章都会以这种形式,有好的建议欢迎评论区留言。

Guess you like

Origin juejin.im/post/7032564525232570381