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里当前键对应的值



目录
相关文章
|
1月前
|
前端开发 机器人 API
前端大模型入门(一):用 js+langchain 构建基于 LLM 的应用
本文介绍了大语言模型(LLM)的HTTP API流式调用机制及其在前端的实现方法。通过流式调用,服务器可以逐步发送生成的文本内容,前端则实时处理并展示这些数据块,从而提升用户体验和实时性。文章详细讲解了如何使用`fetch`发起流式请求、处理响应流数据、逐步更新界面、处理中断和错误,以及优化用户交互。流式调用特别适用于聊天机器人、搜索建议等应用场景,能够显著减少用户的等待时间,增强交互性。
278 2
|
3天前
|
JavaScript 前端开发 程序员
前端原生Js批量修改页面元素属性的2个方法
原生 Js 的 getElementsByClassName 和 querySelectorAll 都能获取批量的页面元素,但是它们之间有些细微的差别,稍不注意,就很容易弄错!
|
1月前
|
JavaScript 前端开发 程序员
前端学习笔记——node.js
前端学习笔记——node.js
43 0
|
13天前
|
存储 算法 Java
leetcode算法题-有效的括号(简单)
【11月更文挑战第5天】本文介绍了 LeetCode 上“有效的括号”这道题的解法。题目要求判断一个只包含括号字符的字符串是否有效。有效字符串需满足左括号必须用相同类型的右括号闭合,并且左括号必须以正确的顺序闭合。解题思路是使用栈数据结构,遍历字符串时将左括号压入栈中,遇到右括号时检查栈顶元素是否匹配。最后根据栈是否为空来判断字符串中的括号是否有效。示例代码包括 Python 和 Java 版本。
|
1月前
|
人工智能 自然语言处理 程序员
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
欢迎来到工程师令狐小哥的频道。本文介绍如何利用AI工具高效刷LeetCode,通过通义灵码插件在IntelliJ IDEA中实现代码生成、优化、单元测试等功能,提升编程学习效率。
64 1
通义灵码:融合创新玩法与探索,重塑LeetCode解题策略
|
15天前
|
机器学习/深度学习 自然语言处理 前端开发
前端神经网络入门:Brain.js - 详细介绍和对比不同的实现 - CNN、RNN、DNN、FFNN -无需准备环境打开浏览器即可测试运行-支持WebGPU加速
本文介绍了如何使用 JavaScript 神经网络库 **Brain.js** 实现不同类型的神经网络,包括前馈神经网络(FFNN)、深度神经网络(DNN)和循环神经网络(RNN)。通过简单的示例和代码,帮助前端开发者快速入门并理解神经网络的基本概念。文章还对比了各类神经网络的特点和适用场景,并简要介绍了卷积神经网络(CNN)的替代方案。
|
15天前
|
移动开发 前端开发 JavaScript
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
于辰在大学期间带领团队参考网易游戏官网的部分游戏页面,开发了一系列前端实训作品。项目包括首页、2021校园招聘页面和明日之后游戏页面,涉及多种特效实现,如动态图片切换和人物聚合效果。作品源码已上传至CSDN,视频效果可在CSDN预览。
24 0
前端实训,刚入门,我用原生技术(H5、C3、JS、JQ)手写【网易游戏】页面特效
|
20天前
|
JavaScript 前端开发 开发者
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第27天】在前端开发领域,Vue.js和Angular是两个备受瞩目的框架。本文对比了两者的优劣,Vue.js以轻量级和易上手著称,适合快速开发小型到中型项目;Angular则由Google支持,功能全面,适合大型企业级应用。选择时需考虑项目需求、团队熟悉度和长期维护等因素。
28 1
|
21天前
|
JavaScript 前端开发 API
前端框架对比:Vue.js与Angular的优劣分析与选择建议
【10月更文挑战第26天】前端技术的飞速发展让开发者在构建用户界面时有了更多选择。本文对比了Vue.js和Angular两大框架,介绍了它们的特点和优劣,并给出了在实际项目中如何选择的建议。Vue.js轻量级、易上手,适合小型项目;Angular结构化、功能强大,适合大型项目。
17 1
|
24天前
|
前端开发 JavaScript UED
"前端小技巧大揭秘:JS如何将后台时间戳秒变亲切小时前、分钟前,让用户秒懂,提升互动体验!"
【10月更文挑战第23天】在Web开发中,将后台返回的时间戳转换为“小时前”、“分钟前”、“刚刚”等友好的时间描述是常见需求。本文介绍如何用JavaScript实现这一功能,通过计算当前时间和时间戳的差值,返回相应的描述,提升用户体验。
26 1
下一篇
无影云桌面