LeetCode 20 有效括号 | 刷题 01

469 阅读1分钟

题目描述

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

有效字符串需满足:

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

来源:力扣

示例1

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

示例2

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

示例3

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

示例4

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

示例5

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

题目分析

验证括号的对称性,括号总共分为三类:()[]{},可以利用栈先进后出的特性,将所有左括号([{先入栈,然后再碰到右括号时,让它与栈顶的元素进行匹配,比如当遇到)时,如果栈顶是(,则说明匹配成功,栈顶元素出栈再继续字符串循环的流程,如果匹配错误就直接返回 false。假设要匹配字符串([{}])是否合法,执行流程如下

题解如下

var isValid = function (s) {
    let valid = true;
    const stack = [];
	// 定义字符串匹配 mapper
    const mapper = {
      "{": "}",
      "[": "]",
      "(": ")",
    };
  
    for (let i in s) {
      const v = s[i];
      //indexOf() 方法可返回某个指定的字符串值在字符串中首次出现的位置。
      if (["(", "[", "{"].indexOf(v) > -1) {
      //如果是(、[、{ 则入栈
        stack.push(v);
      } else {
        // pop 返回删除的元素。
        // 左括号栈顶元素出栈,
        const peak = stack.pop();
        //判断是否是对应匹配的右括号 
        if (v !== mapper[peak]) {
          return false;
        }
      }
    }
   // 遍历结束,如果仍有未匹配完的左括号,返回 false
    if (stack.length > 0) return false;
    return valid;
  };
  console.log(isValid('(){)'));
  console.log(isValid('(){}'));
  console.log(isValid('([{}])'));

总结

这道题有很多种解法,我选择了栈来解决。选择适合自己理解的解法,希望自己继续努力吧!