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



目录
相关文章
|
7天前
|
存储 前端开发 JavaScript
前端基础(二)_JavaScript变量、JavaScript标识符、JavaScript获取元素、JavaScript的鼠标事件
本文介绍了JavaScript变量的声明和使用、标识符的命名规则、如何获取和操作HTML元素,以及JavaScript的鼠标事件处理,通过示例代码展示了这些基础知识点在实际开发中的应用。
22 2
前端基础(二)_JavaScript变量、JavaScript标识符、JavaScript获取元素、JavaScript的鼠标事件
|
7天前
|
Web App开发 JavaScript 前端开发
前端基础(一)_初识JavaScript
本文介绍了JavaScript的起源、核心组成(ECMAScript、DOM、BOM),并解释了JavaScript的三种引入方式:行内引入、内部引入和外部引入,以及`window.onload`的使用,最后讨论了网页、网站、浏览器和兼容性的概念。
13 2
前端基础(一)_初识JavaScript
|
7天前
|
前端开发 JavaScript
前端基础(八)_JavaScript循环(for循环、for-in循环、for-of循环、while、do-while 循环、break 与 continue)
本文介绍了JavaScript中的循环语句,包括for循环、for-in循环、for-of循环、while循环、do-while循环以及break和continue的使用。
26 1
前端基础(八)_JavaScript循环(for循环、for-in循环、for-of循环、while、do-while 循环、break 与 continue)
|
7天前
|
存储 前端开发 JavaScript
前端基础(三)_JavaScript数据类型(基本数据类型、复杂数据类型)
本文详细介绍了JavaScript中的数据类型,包括基本数据类型(Number、String、Boolean、Undefined、Null)和复杂数据类型(Object),并解释了如何使用`typeof`操作符来识别变量的数据类型。同时,还讨论了对象、函数和数组等复杂数据类型的使用方式。
13 2
|
6天前
|
算法 前端开发 机器人
一文了解分而治之和动态规则算法在前端中的应用
该文章详细介绍了分而治之策略和动态规划算法在前端开发中的应用,并通过具体的例子和LeetCode题目解析来说明这两种算法的特点及使用场景。
一文了解分而治之和动态规则算法在前端中的应用
|
6天前
|
算法 前端开发
一文了解贪心算法和回溯算法在前端中的应用
该文章深入讲解了贪心算法与回溯算法的原理及其在前端开发中的具体应用,并通过分析LeetCode题目来展示这两种算法的解题思路与实现方法。
|
2月前
|
Java 开发者 关系型数据库
JSF与AWS的神秘之旅:如何在云端部署JSF应用,让你的Web应用如虎添翼?
【8月更文挑战第31天】在云计算蓬勃发展的今天,AWS已成为企业级应用的首选平台。本文探讨了在AWS上部署JSF(JavaServer Faces)应用的方法,这是一种广泛使用的Java Web框架。通过了解并利用AWS的基础设施与服务,如EC2、RDS 和 S3,开发者能够高效地部署和管理JSF应用。文章还提供了具体的部署步骤示例,并讨论了使用AWS可能遇到的挑战及应对策略,帮助开发者更好地利用AWS的强大功能,提升Web应用开发效率。
51 0
|
2月前
|
移动开发 前端开发 JavaScript
前端表单验证的完美攻略:HTML5属性与JavaScript方法的无缝对接,让你的Web应用数据输入既安全又优雅
【8月更文挑战第31天】本文介绍前端表单验证的重要性及其实现方法,利用HTML5的内置属性如`required`、`pattern`和`minlength`进行基本验证,并借助JavaScript处理复杂逻辑,如密码确认。通过示例代码详细展示了如何结合两者实现高效且友好的表单验证,同时使用CSS增强用户体验。此方法简化开发流程并提升验证效果。
32 0
|
1天前
|
传感器 算法 C语言
基于无线传感器网络的节点分簇算法matlab仿真
该程序对传感器网络进行分簇,考虑节点能量状态、拓扑位置及孤立节点等因素。相较于LEACH算法,本程序评估网络持续时间、节点死亡趋势及能量消耗。使用MATLAB 2022a版本运行,展示了节点能量管理优化及网络生命周期延长的效果。通过簇头管理和数据融合,实现了能量高效和网络可扩展性。
|
28天前
|
算法 BI Serverless
基于鱼群算法的散热片形状优化matlab仿真
本研究利用浴盆曲线模拟空隙外形,并通过鱼群算法(FSA)优化浴盆曲线参数,以获得最佳孔隙度值及对应的R值。FSA通过模拟鱼群的聚群、避障和觅食行为,实现高效全局搜索。具体步骤包括初始化鱼群、计算适应度值、更新位置及判断终止条件。最终确定散热片的最佳形状参数。仿真结果显示该方法能显著提高优化效率。相关代码使用MATLAB 2022a实现。
下一篇
无影云桌面