【刷穿leetcode】20. 有效的括号|刷题打卡

256 阅读2分钟

一、题目描述

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

二、思路分析:

栈的解题思路

审题后获得的信息是,有效字符串匹配规则:先出现的括号后匹配。因此我们便想到先进后出的栈。借用栈的数据结构,在遍历字符串的时候,匹配到左括号时,就把对应的右括号压入栈;当匹配到右括号时判断和栈顶弹出的元素是否相同即可,是有效字符串的话,最后栈是清空的。

注意有效字符串的长度一定是偶数,如果是奇数,我们可以直接返回false,省去后续不必要的遍历计算。

三、AC 代码:

var isValid = function(s) {
  const n = s.length;
  if (n % 2 === 1) return false;
  const map = {
    '(': ')',
    '[': ']',
    '{': '}'
  };
  let stack = [];
  let top;
  for(var char of s) {
    let value;
    if((value = map[char])) {
      stack.push(value)
    }else{
      top = stack.pop()
      if(top !== char) {
        return false;
      }
    }
  }
  return !stack.length;
};

四、总结:

有效的括号,是高频出现的算法考点。这题到底可以考察我们哪些功力呢?
经过思考后,我得出了这样的答案:

  1. 这题首先考察做题者的对基本数据结构是否都了解其特点,能否在具体的使用场景选择合适的数据结构解决问题;
  2. 其次考察做题者能否仔细观察输入数据,判断输入长度、边界,对特殊情况进行判断,减少不必要的计算。

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