刷 leetcode有效的括号 | 刷题打卡

366 阅读1分钟

一、题目描述:

原题地址

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

有效字符串需满足:

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

提示:

  • 1 <= s.length <= 10^4
  • s 仅由括号 '()[]{}' 组成
示例 1:

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

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

示例 3:
输入:s = "(]"
输出:false

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

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

二、思路分析:

其实典型的栈思路。

  • 只有括号,所以只有是str长度是奇数肯定就是无效的
  • 遍历字符串
  • 遇到左括号,就往另一个数组里塞(进栈)
  • 遇到右括号,看下是不是对应的数组里的最后一项左括号对应的右括号,是则把数组的最后一项扔出去(出栈)
  • 字符串遍历完,数组里只要有,肯定就是无效的,反之则有效

js的一个稍微巧妙的法子:map类型将左括号和右括号一一对应

三、AC 代码:

/**
 * @param {string}
 * @return {boolean}
 */

const isValid = function (s) {
  if (s.length % 2 === 1) {
    return false;
  }
  const res = [];
  const map = new Map([
    ['[', ']'],
    ['(', ')'],
    ['{', '}'],
  ]);
  for (const str of s) {
    const isLeft = map.has(str);
    if (isLeft || !res.length) res.push(str);
    else {
      // 是右边符号的话,看下是不是res最后一个左括号对应的右括号
      // 是则删除最后一个,不是则直接返回false
      if (map.get(res[res.length - 1]) !== str) {
        return false;
      }
      res.pop();
    }
  }

  return !res.length;
};

四、总结:

  • 栈思想的运用
  • map类型的运用