LeetCode-有效的括号|刷题打卡

204 阅读2分钟

前言

做完两数之和然后就信心满满的去做两数相加了,乍一看,挺简单..不就是数组转字符串在相加吗?

然后行云流水般的写下来如下的代码:

var addTwoNumbers = function(l1, l2) {
  let num1 = l1.reverse().join("");
  let num2 = l2.reverse().join("");
  return (num1 + num2).toString().split("");
};
addTwoNumbers([2, 4, 3], [5, 6, 4]);

reverse 报错?然后才发现,原来是自己实现一个 ListNode,看了看评论.. 我还是换一个吧

题目:有效的括号

描述

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

解法

利用栈先进后出的特性,依次左储存括号,每当遇到右括号时,就去匹配响应的左括号,匹配成功则出栈,最后栈为空则表示匹配正确。

let isValid = function(s) {
  let strArr = s.split("");
  let len = s.length;
  let flagArr = {
    "(": ")",
    "{": "}",
    "[": "]",
  };
  let stack = []; // 存放临时括号
  for (let i = 0; i < len; i++) {
    let left = strArr[i];
    if (flagArr.hasOwnProperty(left)) {
      stack.push(left);
    } else {
      if (strArr[i] !== flagArr[stack.pop()]) {
        return false;
      }
    }
  }
  return stack.length == 0;
};

let res = isValid("()[]");
console.log(res); // true

思路:

  1. 使用 split 将传入的字符串转为数组,拿到长度,并建立一个左右括号的映射。
  2. 建立 stack 空栈,用于储蓄括号。
  3. for 这个数组
    1. 判断出现左括号时,将当前左括号入栈。
    2. 判断非左括号(也就是右括号时),将最后入栈的左括号拿来比对是否匹配
      1. 匹配则出栈,然后继续 for
      2. 不匹配就 return false
    3. for 结束后,判断栈为空,就 return true

总结

用到了栈的一些特性,用数组模拟栈先入后出的原则。然后通过匹配得出结果。

本文正在参与「掘金 2021 春招闯关活动」, 点击查看 活动详情