每日算法:有效的括号

开发 前端 算法
当遍历完成时,所有已匹配的字符都已匹配出栈,如果此时栈为空,则字符串有效,如果栈不为空,说明字符串中还有未匹配的字符,字符串无效。

 [[420388]]

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

有效字符串需满足:

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

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

示例 1:

  1. 输入: "()" 
  2. 输出: true 

示例 2:

  1. 输入: "()[]{}" 
  2. 输出: true 

示例 3:

  1. 输入: "(]" 
  2. 输出: false 

示例 4:

  1. 输入: "(]" 
  2. 输出: false 

示例 5:

  1. 输入: "([)]" 
  2. 输出: false 

解答:利用栈结构

解题思路: 将字符串中的字符依次入栈,遍历字符依次判断:

  • 首先判断该元素是否是 { 、 ( 、 [ ,直接入栈
  • 否则该字符为 } 、 ) 、 ] 中的一种,如果该字符串有效,则该元素应该与栈顶匹配,例如栈中元素有 ({, 如果继续遍历到的元素为 ), 那么当前元素序列为 ({) 是不可能有效的,所以此时与栈顶元素匹配失败,则直接返回 false ,字符串无效

当遍历完成时,所有已匹配的字符都已匹配出栈,如果此时栈为空,则字符串有效,如果栈不为空,说明字符串中还有未匹配的字符,字符串无效

画图帮助理解一下:

代码实现:

  1. const isValid = function(s) { 
  2.     let map = { 
  3.         '{''}'
  4.         '('')'
  5.         '['']' 
  6.     } 
  7.     let stack = [] 
  8.     for(let i = 0; i < s.length ; i++) { 
  9.         if(map[s[i]]) { 
  10.             stack.push(s[i]) 
  11.         } else if(s[i] !== map[stack.pop()]){ 
  12.             return false 
  13.         } 
  14.     } 
  15.     return stack.length === 0 
  16. }; 

时间复杂度:O(n)

空间复杂度:O(n)

责任编辑:武晓燕 来源: 三分钟学前端
相关推荐

2020-10-16 08:09:58

算法代码字符串

2022-01-19 09:01:28

字符串LeetCode

2021-10-19 10:09:21

三角形个数数组

2021-03-02 08:21:58

LeetCode括号

2021-10-29 07:25:32

螺旋矩阵整数

2021-10-28 19:33:36

矩阵图像内存

2021-11-19 07:54:40

前端

2021-11-12 09:44:03

字符串算法复杂度

2021-10-27 10:43:36

数据流中位数偶数

2021-09-30 09:58:14

路径总和二叉树

2021-11-04 09:59:03

动态规划策略

2021-09-03 09:41:36

字符串时间复杂度

2021-09-02 09:22:13

算法无重复字符

2021-09-10 08:31:54

翻转字符串单词

2021-10-26 00:23:26

算法高频元素

2021-09-15 07:56:32

二叉树层次遍历

2021-09-29 10:19:00

算法平衡二叉树

2021-09-28 06:28:51

二叉树公共祖先

2021-09-08 09:52:34

语言

2021-08-26 05:08:25

相邻重复项算法
点赞
收藏

51CTO技术栈公众号