Skip to content

有效的括号

简单

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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。

示例 1:

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

示例 2:

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

示例 3:

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

提示:

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

题解

  1. 先判断字符串长度是否为偶数,如果不是则直接返回 false;
  2. 创建一个对象/map存储括号对
  3. 创建一个栈,循环遍历字符串
  • 当遍历到的字符为左括号 ( { [ 时,将字符入栈
  • 当遍历到的字符为右括号 ) } ] 时,将栈顶元素出栈,并判断栈顶元素是否与该右括号匹配,如果不匹配则返回 false
  1. 遍历完成后,判断栈的长度是否为 0,为 0 则返回 true,否则返回 false
javascript
var isValid = function (s) {
  // 如果字符串能组成有效的括号,则长度一定是偶数
  if (s.length % 2 !== 0) return false;

  // 用一个对象存储括号对,也可以像官方一样使用map
  const pairs = {
    ")": "(",
    "}": "{",
    "]": "[",
  };

  const stack = [];

  // 循环字符串
  for (let ch of s) {
    if (pairs[ch]) {
      // 遇到右括号则弹出栈顶元素,并判断右括号是否能和栈顶元素匹配
      if (stack.pop() !== pairs[ch]) return false;
    } else {
      // 遇到左括号则入栈
      stack.push(ch);
    }
  }

  // 循环结束的时候还要判断栈是否为空
  return stack.length === 0;
};

不借助哈希表

javascript
var isValid = function (s) {
  const stack = [];
  for (let ch of s) {
    switch (ch) {
      case "(":
        stack.push(")");
        break;
      case "{":
        stack.push("}");
        break;
      case "[":
        stack.push("]");
        break;
      default:
        if (stack.pop() !== ch) return false;
    }
  }
  return stack.length === 0;
};