【leetCode 20】有效的括号——极致优化

62 阅读1分钟
function isValid(s: string): boolean {
  const size = s.length;
  //字符串为奇数,括号肯定不一一对应,直接返回false
  if (size % 2 !== 0) {
    return false;
  }

  const hash = new Map([
    [")", "("],
    ["]", "["],
    ["}", "{"],
  ]);

  //   最后一个如果为 (、[、{ ,则不会再有匹配的了
  if (!hash.has(s[size - 1])) {
    return false;
  }

  // 第一个如果为 )、]、} ,则直接就有问题,返回false
  if (hash.has(s[0])) {
    return false;
  }

  // 栈
  const bracketStack: string[] = [];
  for (let i = 0; i < s.length; i++) {
    const bracket = s[i];

    //如果 栈 为空,而此时括号为)、]、} 的话,则直接返回false
    if (bracketStack.length === 0 && hash.has(bracket)) {
      return false;
    }

    // 括号为 )、]、} ,则需要去栈里找到对应的
    if (hash.has(bracket)) {
      // 如果栈为空,或者不对应则直接返回false
      if (bracketStack.length === 0 || hash.get(bracket) !== bracketStack[0]) {
        return false;
      }
      //找到对应的,删除
      bracketStack.shift();
    } else {
      //向栈推入
      bracketStack.unshift(bracket);
    }
  }
  return bracketStack.length === 0;
}

console.log(isValid("()"));