LeetCode有效的括号使用JavaScript解题|前端学算法

简介: LeetCode有效的括号使用JavaScript解题|前端学算法

有效的括号


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

有效字符串需满足:

  1. 左括号必须用相同类型的右括号闭合。
  2. 左括号必须以正确的顺序闭合。
  3. 每个右括号都有一个对应的相同类型的左括号。  

例 1

输入:s = "()"

输出:true

示例 2:

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

输出:true

示例 3:

输入:s = "(]"

输出:false


解题思路


根据有效字符串的要求我们可以知道,这个字符串的长度肯定是偶数,当有一个左括号时下一个应该是与其匹配的右括号或者是左括号

此时我们利用栈的先进后出,只能栈顶元素出来的特点来解决它

不了解栈的朋友可以看这一片文章:栈,队列和链表三者之间的关系与区别

遍历字符串时,当遇到一个左括号,我们会期望在后续的遍历中,有一个相同类型的右括号将其闭合。由于后遇到的左括号要先闭合,因此我们可以将这个左括号放入栈顶。

左括号入栈:


image.png


到右括号时,匹配栈顶元素,符合则出栈:


image.png


当遇到一个右括号时,此时可以取出栈顶的左括号并判断它们是否是相同类型的括号。如果不是相同的类型,或者栈中并没有左括号了,那么字符串 s无效,则返回false。如果字符串遍历到最后,栈为空则证明这个字符串是有效括号


image.png


为了判断当前字符是左括号还是右括号,可以使用map结构来先存储配对的括号,把左括号作为,右括号作为

具体解题步骤我们可以分为一下几步:

  • 第一步:判断字符串的长度是不是偶数,如果不是则直接返回false
  • 第二步:初始化一个map,把左括号作为,右括号作为;再初始化一个空栈stack,用来存放左括号。
  • 第三步:遍历字符串,获取当前值
  • 第四步:判断当前值,是不是map里的(左括号),如果是则把当前值入栈;如果不是则把栈顶元素作为键取出map的值,如果和当前字符相同,则就证明是一个有对括号可以把栈顶元素删除,然后继续进行第三步第四步操作;如果不一样则就返回false。
  • 第五步:当栈为空时,说明这是有效字符串,返回true,否则返回false
var isValid = function(s) {
    if(s.length%2 === 1) return false
    // 初始化一个map结构
    let map = new Map([
        ['(',')'],
        ['[',']'],
        ['{','}']
    ])
    // 初始化一个栈用来存放 左括号
    let stack= []
    for(let current of s){
        if(map.has(current)){
            // 左括号 入栈
            stack.push(current)
        }else{
            // 当前右括号 与栈顶元素匹配
            if(current === map.get(stack[stack.length-1])){
                stack.pop()
            }else{
                return false
            }
        }
    }
    // 长度为0返回true,栈内还有内容就返回false
    return !stack.length
};


image.png


知识点


  • map初始化:Map 函数可以接受一个数组作为参数,用来进行初始化。但是跟 Set 不同的是,Map 中该数组中的成员是一对对表示键值对的数组(或有点类似数组的对象)。
let map = new Map([
     // [键 , 值]
        ['(',')'],
        ['[',']'],
        ['{','}']
    ])

has()方法判断map里有没有这一个键

get()方法获取map里当前键对应的值



目录
相关文章
|
3月前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
4月前
|
人工智能 自然语言处理 程序员
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
欢迎来到工程师令狐小哥的频道。本文介绍如何利用AI工具高效刷LeetCode,通过通义灵码插件在IntelliJ IDEA中实现代码生成、优化、单元测试等功能,提升编程学习效率。
158 1
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
|
4月前
|
算法
每日一道算法题(Leetcode 20)
每日一道算法题(Leetcode 20)
47 2
|
4月前
|
算法 Java 程序员
【算法每日一练及解题思路】有n级台阶,一次只能上1级或2级,共有多少种走法?
本文深入解析了“爬楼梯问题”,探讨了递归与迭代两种解法,并提供了Java代码实现。通过分析问题本质,帮助读者理解动态规划技巧,提高解决实际编程问题的能力。关键词:Java, 算法, 动态规划, 爬楼梯问题, 递归, 迭代。
169 0
|
4月前
|
算法 C++
【算法解题思想】动态规划+深度优先搜索(C/C++)
【算法解题思想】动态规划+深度优先搜索(C/C++)
|
4月前
|
算法
Leetcode 初级算法 --- 数组篇
Leetcode 初级算法 --- 数组篇
59 0
|
6月前
|
人工智能 算法 Java
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
LeetCode经典算法题:井字游戏+优势洗牌+Dota2参议院java解法
69 1
|
6月前
|
存储 算法 Java
LeetCode经典算法题:预测赢家+香槟塔java解法
LeetCode经典算法题:预测赢家+香槟塔java解法
94 1
|
6月前
|
算法 Java
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
80 6
|
6月前
|
存储 算法 Java
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
LeetCode经典算法题:二叉树遍历(递归遍历+迭代遍历+层序遍历)以及线索二叉树java详解
98 0

热门文章

最新文章