Time:2019/4/11
Title: Valid Parentheses
Difficulty: Easy
Author: 小鹿


题目:Valid Parentheses

Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the input string is valid.

An input string is valid if:

  1. Open brackets must be closed by the same type of brackets.
  2. Open brackets must be closed in the correct order.

Note that an empty string is also considered valid.

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

有效字符串需满足:

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

注意空字符串可被认为是有效字符串。

Example 1:

Input: "()"
Output: true
复制代码

Example 2:

Input: "()[]{}"
Output: true
复制代码

Example 3:

Input: "(]"
Output: false
复制代码

Example 4:

Input: "([)]"
Output: false
复制代码

Example 5:

Input: "{[]}"
Output: true
复制代码

Solve:

▉ 算法思路

1、首先,我们通过上边的例子可以分析出什么样子括号匹配是复合物条件的,两种情况。

  • 第一种(非嵌套情况):{} []
  • 第二种(嵌套情况):{ [ ( ) ] }

除去这两种情况都不是符合条件的。

2、然后,我们将这些括号自右向左看做栈结构,右侧是栈顶,左侧是栈尾。

3、如果编译器中的括号左括号,我们就入栈(左括号不用检查匹配);如果是右括号,就取出栈顶元素检查是否匹配。(提前将成对的括号通过键值对的方式存到散列表中)

4、如果匹配,就出栈。否则,就返回 false;

▉ 代码实现

下方代码在标准的 Leetcode 测试中并不是最省内存和效率高的,因为我们用到了 Map,在内

var isValid = function(s) {let stack = [];//将括号匹配存入散列表中let map = new Map();map.set(")","(");map.set("]","[");map.set("}","{");// 取出字符串中的括号for(let i = 0; i < s.length; i++){let c = s[i];//如果是右括号,如果栈中不为空就出栈栈顶数据if(map.has(c)){//判断栈此时是否为0if(stack.length !== 0){//如果栈顶元素不相同,就返回 falseif(stack.pop() !== map.get(c)){return false;}//如果此时栈内无元素,返回false}else{return false;}}else{//如果是左括号,就进栈stack.push(c);}}//如果栈为空,括号全部匹配成功return stack.length === 0;
};
let str = "({(})";
console.log(isValid(str));
复制代码

▉ 代码改进

1)该改进用对象替代了 Map,节省了内存空间。

2)在判断时,没有用到提前存储的结构,直接使用当遇到左括号是直接入栈,提高了执行效率。

var isValid = function(s) {let stack = [];var obj = {"]": "[","}": "{",")": "(",};for(var i = 0; i < s.length; i++) {if(s[i] === "[" || s[i] === "{" || s[i] === "(") {stack.push(s[i]);} else {var key = stack.pop();if(maps[key] !== s[i]) {return false;}}}if(!stack.length) {return true;}return false;
};
复制代码

▉ 复杂度分析

时间复杂度: O(n)。只需要遍历一遍字符串中的字符,入栈和出栈的时间复杂度为 O(1)。

空间复杂度: O(n)。当只有左括号近栈,没有右括号进行匹配的时候是最糟糕的情况,所有括号都在栈内。例如:{{{{{{{{{


欢迎一起加入到 LeetCode 开源 Github 仓库,可以向 me 提交您其他语言的代码。在仓库上坚持和小伙伴们一起打卡,共同完善我们的开源小仓库! Github:https://github.com/luxiangqiang/JS-LeetCode


欢迎关注我个人公众号:「一个不甘平凡的码农」,记录了自己一路自学编程的故事。

LeetCode 之 JavaScript 解答第20题 —— 有效的括号(Valid Parentheses)相关推荐

  1. LeetCode 之 JavaScript 解答第23题 —— 合并K个有序链表(Merge K Sorted Lists)

    Time:2019/4/10 Title: Merge K Sorted Lists Difficulty: Difficulty Author: 小鹿 题目:Merge K Sorted Lists ...

  2. LeetCode 之 JavaScript 解答第98题 —— 验证二叉搜索树(Validate Binary Search Tree)

    Time:2019/4/24 Title: Vaildata Binary Search Tree Difficulty: Medium Author: 小鹿 题目:Vaildata Binary S ...

  3. LeetCode 之 JavaScript 解答第141题 —— 环形链表 I(Linked List Cycle I)

    Time:2019/4/7 Title: Linked List Cycle Difficulty: Easy Author:小鹿 题目:Linked List Cycle I Given a lin ...

  4. 《LeetCode力扣练习》第20题 有效的括号 Java

    <LeetCode力扣练习>第20题 有效的括号 Java 一.资源 题目: 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效. 有效字符 ...

  5. LeetCode 20. 有效的括号(Valid Parentheses)

    栈思想 关于有效括号表达式的一个有趣属性是有效表达式的子表达式也应该是有效表达式. 整个表达式是有效的,而它的子表达式本身也是有效的.这为问题提供了一种递归结构.(栈思想) 从整体表达式中一次删除一个 ...

  6. 力扣20题 有效的括号(栈、哈希表)

    给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效. 有效字符串需满足: 左括号必须用相同类型的右括号闭合. 左括号必须以正确的顺序闭合. 每个右括号都 ...

  7. 使用JavaScript解答2018第九届蓝桥杯C/C++省赛A组试题

    大三时参加过第七届蓝桥杯个人赛及团队赛,转眼已经两年,最近看了看第九届蓝桥杯试题,打算用JavaScript实现一下. 题目1 标题:分数 1/1 + 1/2 + 1/4 + 1/8 + 1/16 + ...

  8. 小乐乐与二段数(2019哈理工新生赛第20题)

    链接:2019哈理工新生赛题解 2019哈理工新生赛第20题 T题: 链接:https://ac.nowcoder.com/acm/contest/1877/T 来源:牛客网 题目描述 小乐乐从老师口 ...

  9. 力扣 (LeetCode)-对称二叉树,树|刷题打卡

    Github来源:力扣 (LeetCode)|刷题打卡 | 求星星 ✨ | 给个❤️关注,❤️点赞,❤️鼓励一下作者 [已开启]任务一:刷题打卡 * 10 篇 哪吒人生信条:如果你所学的东西 处于喜欢 ...

最新文章

  1. 一个简单的程序来使用WiredTiger 存储引擎
  2. 如何成为一个Android高手
  3. 顺序表循环队列:创建初始化、入队、出队、获取队列头数据、计算队列有效数据长度...
  4. 【学术相关】中国计算机学会推荐中文科技期刊目录
  5. IOS给任意UIView截屏
  6. (二十四)美萍酒店管理系统:散客开单
  7. tas5424_TAS5424
  8. thinkpad e470外接显示器后无声音
  9. NN中的学习技巧之(一)参数的最优化之 Momentum
  10. jquery知识点总结(2)--- CSS模块+筛选模块+文档处理(CUD)模块+事件模块
  11. pycharm运行python程序没有解释器怎么办
  12. 【微信小程序】二维数组列表渲染
  13. C++ reverse
  14. 个税继续教育证书有哪些 计算机,个税专项附加扣除中继续教育哪些证书可以扣除呢?...
  15. 咕咚:约Pao新工具
  16. S2 优化数据库 第三章
  17. 乘积取中法matlab,Matlab常用算法集合
  18. 5年内被辞退3次,35岁程序员该何去何从?百度,kotlin函数参数
  19. 自编STM32轻量级操作系统(五)------互斥量
  20. 【转载】基于 NXP i.MX8QM 的 硬件隔离 介绍

热门文章

  1. SpringMVC 4.0常用注解
  2. Windbg学习 (0x0002) 命令基础
  3. IOS学习之 网络编程(10)--简单介绍ASI框架的使用
  4. C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用
  5. 《C程序员:从校园到职场》出版预告(1):从“高大上”到“柴米油盐”
  6. Java程序内存分析
  7. dell服务器网卡em1改成eth0
  8. JavaWeb学习笔记①——Java向下转型在JavaEE中运用——登陆验证
  9. 将二叉查找树转化为链表的代码实现
  10. Silverlight实例教程 – Datagrid,Dataform数据验证和ValidationSummary