[路飞]_LeetCode题20有效的括号

1,275 阅读1分钟

题目描述

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

有效字符串需满足:

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

示例 1:

输入:s = "()" 输出:true 示例 2:

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

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

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

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

提示:

1 <= s.length <= 10410^4 s 仅由括号 '()[]{}' 组成

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/va… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

题解思路

  1. 左右括号配对原则除了得是同类型,还需要符合就近原则,比如"((",当遇到第一个")"时应该与最后一个"("配对,这符合栈的操作,后进先出。
  2. 我们遇到左括号就压入栈中待匹配。
  3. 遇到右括号就去栈顶找是否为可以配对的左括号,配对成功就移除栈顶元素等待配对下一个左括号,配对失败直接返回。

题解代码

 * @lc app=leetcode.cn id=20 lang=javascript
 *
 * [20] 有效的括号
 */

// @lc code=start
/**
 * @param {string} s
 * @return {boolean}
 */
var isValid = function(s) {
  const n = s.length;
  if (n % 2 === 1) {
      return false;
  }
  const stack = [];
  const map = new Map([
    [")","("],
    ["}","{"],
    ["]","["]
  ]);
  for (let si of s) {
    //当是某个右括号时,去stack栈顶找是否是配对的左括号
    if (map.has(si)) {
      //stack为空或栈顶元素与si不是配对的括号类型,则不是有效括号
      if (!stack.length || stack[stack.length - 1] !== map.get(si)) {
        return false
      }
      stack.pop();//配对成功移除栈顶元素
    }else{
      stack.push(si)//si为左括号时推入栈顶等待配对
    }
  }
  return !stack.length;//stack为空栈说明所有的左括号均成功配对
};
// @lc code=end