LeetCode - 020 - 有效的括号(valid-parentheses)

栏目: IT技术 · 发布时间: 5年前

内容简介:LeetCode - 020 - 有效的括号(valid-parentheses)

Create by jsliang on 2019-06-04 11:39:30
Recently revised in 2019-06-04 14:41:25

一 目录

不折腾的前端,和咸鱼有什么区别

| 目录 | | --- | | 一 目录 | | 二 前言 | | 三 解题 |

二 前言

  • 难度:简单

  • 涉及知识:栈、字符串

  • 题目地址:https://leetcode-cn.com/problems/valid-parentheses/

  • 题目内容

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

  2. 有效字符串需满足:

  3. 左括号必须用相同类型的右括号闭合。

  4. 左括号必须以正确的顺序闭合。

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

  6. 示例 1:

  7. 输入: "()"

  8. 输出: true

  9. 示例 2:

  10. 输入: "()[]{}"

  11. 输出: true

  12. 示例 3:

  13. 输入: "(]"

  14. 输出: false

  15. 示例 4:

  16. 输入: "([)]"

  17. 输出: false

  18. 示例 5:

  19. 输入: "{[]}"

  20. 输出: true

三 解题

  • 官方题解:https://leetcode-cn.com/problems/valid-parentheses/solution/you-xiao-de-gua-hao-by-leetcode/

解题千千万,官方独一家,上面是官方使用 Java 进行的题解。

小伙伴可以先自己在本地尝试解题,再看看官方解题,最后再回来看看 jsliang 讲解下使用 JavaScript 的解题思路。

  • 解题代码

  1. var isValid = function(s) {

  2. let judge = {

  3. '[': ']',

  4. '(': ')',

  5. '{': '}',

  6. }

  7. let parameter = s.split('');

  8. let stack = [];

  9. for (let i = 0; i < parameter.length; i++) {

  10. if (judge[stack[stack.length - 1]] === parameter[i]) {

  11. stack.pop();

  12. } else {

  13. stack.push(parameter[i]);

  14. }

  15. }

  16. if (stack.length == 0) {

  17. return true;

  18. }

  19. return false;

  20. };

  • 执行测试

  1. s: ()[]{}

  2. return: true

  • LeetCode Submit

  1. Accepted

  2. 76/76 cases passed (76 ms)

  3. Your runtime beats 96.48 % of javascript submissions

  4. Your memory usage beats 66.23 % of javascript submissions (33.8 MB)

  • 知识点

  1. split(): split() 方法使用指定的分隔符字符串将一个 String 对象分割成字符串数组,以将字符串分隔为子字符串,以确定每个拆分的位置。 split() 详细介绍

  2. push(): push() 方法将一个或多个元素添加到数组的末尾,并返回该数组的新长度。 push() 详细介绍

  3. pop(): pop() 方法从数组中删除最后一个元素,并返回该元素的值。此方法更改数组的长度。 pop() 详细介绍

  • 解题思路

首先,我们来想下平时玩的翻牌游戏:

游戏屏幕中有 4 * 4 共 16 张牌。

如果在同一个回合中(一个回合能翻 2 次牌),我们翻出来相同的两张牌,就把它摊开(消掉);

如果在同一个回合中翻到两张不同的牌,我们就要把它覆盖回去。

LeetCode - 020 - 有效的括号(valid-parentheses)

这时候,机智如你,有没有想过要一个作弊器,用来记录我们翻过的牌?!

就好比:我们先翻到红包,再翻到炸弹,下一次翻到红包的时候,我们就打开一开始翻到红包的地方……

OK,这么讲,小伙伴们大致清楚了。

现在,我们有一个字符串: (()[]{}),我们要判断它是否是有效的括号,怎么判断呢:

  1. 这些括号必须成对出现,例如: ()、 []、 {}

  2. 这些括号出现的情况不能乱序,例如: ([)]、 {[}]

同时,我们初始化下数据:

  • judge:

  1. {

  2. '[': ']',

  3. '(': ')',

  4. '{': '}',

  5. }

  • parameter: ['(','(',')','[',']','{','}',')']

  • stack: []

然后,我们是不是该开始使用我们的作弊器了:

LeetCode - 020 - 有效的括号(valid-parentheses)

在这个作弊器中,我们将碰到的括号记录起来。

如果碰到下一个括号,是我们想要的类型,那么就消掉最上层的括号;

如果碰到下一个括号,不是我们想要的类型,那么就把它放到数组的最上层。

  1. 遍历第一次, stack 末尾是空的,所以我们执行 push() 操作, stack: ['(']

  2. 遍历第二次, stack 末尾是 '(',通过 judge 转换就是 ')',而在这个位置的 parameter[i] 是'(',两者不相同,所以我们还是执行 push() 操作, stack: ['(','(']

  3. 遍历第三次, stack 末尾是 '(',通过 judge 转换就是 ')',而在这个位置的 parameter[i] 是')',两者相同,所以我们执行 pop() 操作,将数组的末尾给删掉, stack: ['(']

  4. ……以此类推,最后我们的 stack 变成 [] 空数组。

最后,我们根据 stack 是否为空数组,来进行判断这个字符串是不是有效数组。


jsliang 广告推送:
也许小伙伴想了解下云服务器
或者小伙伴想买一台云服务器
或者小伙伴需要续费云服务器
欢迎点击 云服务器推广 查看!

jsliang 的文档库 由 梁峻荣 采用 知识共享 署名-非商业性使用-相同方式共享 4.0 国际 许可协议进行许可。
基于https://github.com/LiangJunrong/document-library上的作品创作。
本许可协议授权之外的使用权限可以从 https://creativecommons.org/licenses/by-nc-sa/2.5/cn/ 处获得。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

大型网站系统与Java中间件开发实践

大型网站系统与Java中间件开发实践

曾宪杰 / 电子工业出版社 / 2014-4-24 / 65.00

本书围绕大型网站和支撑大型网站架构的 Java 中间件的实践展开介绍。从分布式系统的知识切入,让读者对分布式系统有基本的了解;然后介绍大型网站随着数据量、访问量增长而发生的架构变迁;接着讲述构建 Java 中间件的相关知识;之后的几章都是根据笔者的经验来介绍支撑大型网站架构的 Java 中间件系统的设计和实践。希望读者通过本书可以了解大型网站架构变迁过程中的较为通用的问题和解法,并了解构建支撑大型......一起来看看 《大型网站系统与Java中间件开发实践》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

在线进制转换器
在线进制转换器

各进制数互转换器

随机密码生成器
随机密码生成器

多种字符组合密码