leetcode 20. 有效的括号 JavaScript版

「这是我参与11月更文挑战的第 18 天,活动详情查看:2021最后一次更文挑战

题目来源:leetcode 20. 有效的括号

题目

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

有效字符串需满足:

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

示例 1:

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

示例 2:

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

示例 3:

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

示例 4:

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

示例 5:

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

 

提示:

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

题解

提出问题

  • 有效括号需要满足哪些条件?

分析

  • 从题目中可以看处,字符串s值包含'(',')','{','}','[',']',当字符串s满足左括号必须用相同类型的右括号闭合并需要按照正确的顺序闭合

  • 由于括号闭合顺序是先入后出与栈数据结构一样,因此使用栈数据结构来解决问题,定义map变量创建栈存储左括号

  • 通过for of遍历字符串s

  • 当遇到左括号时,通过push入栈stack

  • 当与到右括号时,通过pop出栈stack并判断括号类型是否一样,不一样的话return false

  • 假设字符串s{[()]}

18fc8bbd6d0d72406b12345fb70d05b.png

  • 开始遍历字符串s,此时第一位为左括号{,因此通过push入栈stack

cd57ac88f7d5140a9328d6a99373c05.png

  • 重复执行上述操作,当遇到)时,通过pop出栈并判断类型是否一样

e89039fdddc2b6743ccff53bb357223.png

  • 一样的话继续执行直至字符串s遍历完成时,通过判断stack的长度是否为0,为0则是有效括号

e2483fddc43f5989d2defcccfd12c22.png bdee209c424345289bf3ff6b14625e1.png

  • 当一开始就遇到)时,说明字符串s为无效括号

ccd06f4f42e8a4c1438cc3281fbc996.png

  • 当然我还可以通过字符串s的长度来判断是否有效,字符串s的长度为奇数时必然时无效括号

代码实现

/**
 * @param {string} s
 * @return {boolean}
 */
let isValid = function(s){
    let size = s.length
    if(size % 2 !== 0) return false
    let map = new Map([
        ["]","["],
        [")","("],
        ["}","{"],
    ])
    let stack = []
    for(ch of s){
        if(map.has(ch)){
            if(!stack.length || stack[stack.length - 1] !== map.get(ch)){
                return false
            }
            stack.pop()
        }else{
            stack.push(ch)
        }
    }
    return stack.length === 0
}
复制代码

Guess you like

Origin juejin.im/post/7032299600648077319