「前端每日一问(55)」检查字符串是否是有效的括号

220 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第20天,点击查看活动详情

本题难度:⭐ ⭐ ⭐

本题类型:算法、手写

阿林最近忙爆了,真的没时间认真写文章了,但是再忙也不能忘了学习,不然就懈怠了,最近多更新点前端面试中出现的高频算法题吧。

哪怕每天只学习半小时,也有收获,绝对不能懈怠!

题目描述

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

有效字符串需满足:

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

原题地址:leetcode20. 有效的括号

题目要求

输入: s = "()"
输出: true
输入: s = "()[]{}"
输出: true
输入: s = "(]"
输出: false
输入: s = "([)]"
输出: false
输入: s = "{[]}"
输出: true

题目分析

这道题实在太经典了,栈类型题目必刷题之一。

栈这个数据结构具有后入先出的特征,所以可以用来辅助解答本题。

  • 定义一个对象,把相匹配的括号值存起来,做匹配时用
  • 循环字符串 s,把每一个字符和栈顶的值做匹配
    • 如果匹配得上,栈顶元素出栈
    • 如果匹配不上,就把当前字符的值入栈
  • 最终:
    • 栈里面还有值,说明有多余的括号
    • 栈里面无值,说明这个字符串是有效的括号

图解:

1620837464-anoden-2021-05-13 001904.gif

图片来源:leetcode,侵删。

编码实现

function isValid (s) {
  const obj = {
    '(': ')',
    '[': ']',
    '{': '}'
  }
  let stack = []
  for (let char of s) {
    if (char === obj[stack[stack.length - 1]]) {
      stack.pop()
    } else {
      stack.push(char)
    }
  }
  return stack.length === 0
}

运行结果

vscode leetcode 插件 yyds! 上班“认真工作”的神器🐶

image.png

结尾

阿林水平有限,文中如果有错误或表达不当的地方,非常欢迎在评论区指出,感谢~

如果我的文章对你有帮助,你的👍就是对我的最大支持^_^

我是阿林,输出洞见技术,再会!

上一篇:

「前端每日一问(54)」什么是Tree-Shaking?Vue3 是如何支持 Tree-Shaking 的?

下一篇:

「前端每日一问(56)」请实现一个二分查找