js - leetcode - 有效括号

271 阅读2分钟

这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战

前言

有人相爱,有人夜里开车看海,有人leetcode第一题都做不出来,由此可见,leetcode的题还是有分量的。今天我们就来会会它们

题目描述

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

 

提示:

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

介绍

  • 判断括号的有效性可以使用「栈」这一数据结构来解决
  • 遍历字符串s,当我们遇到一个左括号的时候,我们希望会有一个对应的右括号将其闭合
  • 因为我们先遇到的是左括号,所有可以先把左括号放到数组中
  • 当我们遇到一个右括号的时候,只要把中最顶层的数据取出进行对比,如果一直,那么就表示当前括号是有效括号,进行下次循环
  • 如果对比不一直,那么,表示当前括号不是一个有效的括号,我们直接返回false就行
  • 在遍历结束后,如果为空,那么就表示,所有的括号都匹配完成,返回false
  • 否则表示有一部分括号是没有完成匹配的,当前字符串s不是一个有效的括号,那么返回false即可
  • 还有就是,有效括号的长度一定是个偶数,如果是奇数,直接返回false

解法

var isValid = function (s) {
    if (s.length % 2 == 1) return false
    const obj = {
        '(': ')',
        '[': ']',
        '{': '}'
    }
    const stack = []
    for (let i = 0; i < s.length; i++) {
        const v = obj[s[i]]
        if (v) {
            stack.push(v)
        } else {
            const popValue = stack.pop()
            if (popValue !== s[i]) {
                return false
            }
        }
    }
    if (stack.length === 0) {
        return true
    }
    return false
};

写在最后

  • 希望你能收获满满