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/ 处获得。


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

查看所有标签

猜你喜欢:

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

计算几何

计算几何

奥罗克 / 机械工业 / 2005-4 / 49.00元

本书介绍了在计算机图形学、机器人和工业设计领域逐渐兴起的几何算法的设计和实现。计算几何中使用的基本技术包括多边形三角剖分、凸包、Voronoi图、排列、几何查找、运动计划等。虽然自主处理只涉及数学基础知识领域的一部分,但是它却和当今该研究领域的前沿课题相关。因此,专业的程序员会发现本书是一本不可多得的参考书。   与上一版相比,本版包括以下几方面的新内容:多边形三角剖分的随机化算法、平面点定......一起来看看 《计算几何》 这本书的介绍吧!

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

多种字符组合密码

Markdown 在线编辑器
Markdown 在线编辑器

Markdown 在线编辑器

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具