Leetcode 20. 有效的括号

238 阅读2分钟

题目链接:leetcode-cn.com/problems/va…

一. 思路

  1. 左括号必须用相同类型的括号闭合。 这意味着对称,就可以运用站先进后出原则,数据的入栈和出栈刚好是对称的。括号会被先推进去,若堆对称,当前的右括号一定是和栈定的左括号相匹配的。
  2. 我们看一个示例

首先遍历 “(” 把左括号推入到栈中,遍历到 “)” 时,正常来说我们会发现右括号和栈顶的左括号必然是一对,此时是一对就返回true,如果不是一堆则返回 false。 3. 最后当所有的括号都匹配成功,栈应为空 3. 考虑边界值当一个括号都没有的时候返回 false

二、代码

  1. 首先我们要准备好一个栈,是一个数组 stack = []。
  2. 其次要能判断是左括号,还是右括号,由于本题中只有3种括号可以直接进行判断,“(”, “[”,“{”。
  3. 如果是左括号的话推进栈,如果是右括号的话要进行匹配,匹配的方法准备一个字典也就是一个对象。
const leftToRight = {
  "(": ")",
  "[": "]",
  "{": "}"
};
  1. 如果此时栈不为空,把栈顶的左括号取出,在字典中找到对应的右括号,若和此时遍历到的字符串一致就返回true
  2. 栈为空 .length === 0, return stack.length!
const isValid = function(value) {
  // 结合题意,空字符串无条件判断为 true
  if (!value) {
    return true;
  }
  // 初始化 stack 数组
  const stack = [];
  // 缓存字符串长度
  const len = value.length;
  // 遍历字符串
  for (let i = 0; i < len; i++) {
    // 缓存单个字符
    const ch = value[i];
    // 判断是否是左括号, 是就推入到栈中
    if (ch === "(" || ch === "{" || ch === "[") stack.push(ch);
    // 若不是左括号,则必须是和栈顶的左括号相配对的右括号
    else {
      // 若栈不为空,且栈顶的左括号没有和当前字符匹配上,那么判为无效
      if (!stack.length || leftToRight[stack.pop()] !== ch) {
        return false;
      }
    }
  }
  // 若所有的括号都能配对成功,那么最后栈应该是空的
  return !stack.length;
};