有效括号(Valid-Parentheses)

题干如下:

给定一个只包括 ‘(‘,’)’,’{‘,’}’,’[‘,’]’ 的字符串,判断字符串是否有效。
有效字符串需满足:
1.左括号必须用相同类型的右括号闭合。
2.左括号必须以正确的顺序闭合。
3.注意空字符串可被认为是有效字符串。
示例 1:
输入: “()”
输出: true
示例 2:
输入: “()[]{}”
输出: true
示例 3:
输入: “(]”
输出: false
示例 4:
输入: “([)]”
输出: false
示例 5:
输入: “{[]}”
输出: true
来源:力扣

解题思路

这题是我大学老师教 这种数据结构的应用场景时讲解的题目,稍微有一丢丢怀念。

解题思路很简单:从左到右遍历字符串,遇到 左括号: [ ( { ** 就压入栈中,遇到 **右括号: ] ) } 就拿 栈顶元素当前元素 匹配,是否是一对括号。是,则继续遍历,不是,则直接返回 false

注:
1. 是一种很常见的数据结构,特点是先进后出
2. 栈顶元素 每次比较之后都要从栈中移除,即 pop 操作
3. 为什么是遇到 左括号 将其压入栈中呢?假设我们将 右括号 压入栈中,由于我们是从左往右遍历的,当遇到 左括号 时假设我们取出栈顶元素 右括号 进行比较,这时候有一个问题:当前比较的 左括号 的位置其实是在 右括号 之后的,即类似 ][
聪明的小伙伴一定猜到了,当我们从右向左遍历时,压入栈的就是 右括号 啦。

流程图如下:

代码实现

由于需要基于 这种数据结构来解题,我简单用 go 实现了一个栈:

type Stack struct {stack []byte // 存放字节length int // 内部维护的长度
}// 压栈
func (s *Stack) push(b byte) {s.stack = append(s.stack,b)s.length ++
}// 出栈
func (s *Stack) pop() (res byte) {if s.length <= 0 {return}s.length --res = s.stack[s.length]s.stack = s.stack[0:s.length]return
}// 判断栈是否为空
func (s *Stack) isEmpty() bool {return s.length <= 0
}// 构造
func getStack() *Stack {return &Stack{}
}

下面的代码实现,基于上面的数据结构:

func isValid(s string) bool {if len(s) <= 0 {return true}// 实例化栈stack := getStack()for i := 0; i < len(s); i++ {// 判断是左括号就压入栈if s[i] == '(' || s[i] == '[' || s[i] == '{' {stack.push(s[i])} else {// 如果栈为空,这时候 i 没有越界,则返回 falseif stack.isEmpty() {return false}// 获取栈顶元素top := stack.pop()// 比较是否匹配if '(' == top && s[i] != ')' || '[' == top && s[i] !=']' || '{' == top && s[i] !='}'{return false}}}// 如果 i 越界,并且 栈 为空,则返回 trueif stack.isEmpty() {return true}return false
}

扩展思路

在用 解题的过程中会发现: 如果字符串是有效括号,那么一
定存在一对相邻的括号,并且第一个匹配的右括号,左边的元素一定是
相对应的左括号。

基于上面的认知,我们将这对相邻的括号替换成空字符串,剩下的字符串,如果是有效字符串,仍会存在一对相邻的括号,同理再替换,依次循环。如果不存在一对相邻的括号,并且最后剩下的字符串为空了,那么原始字符串就是有效括号,否则不是。

流程图如下:

具体的代码实现如下:( 只是提供一种思路,这种实现方式时间复杂度有点高

func isValidOther(s string) bool {// 判断是否有一对相邻的括号for strings.Index(s,"()") != -1 || strings.Index(s,"[]") != -1 || strings.Index(s,"{}") != -1 {// 存在,则替换成 空字符串, 继续下次判断s = strings.Replace(s,"()","",-1)s = strings.Replace(s,"[]","",-1)s = strings.Replace(s,"{}","",-1)}// 如果不存在一对相邻的括号,并且剩余的字符串长度不为0,则返回 falseif len(s) >= 1 {return false}return true
}

总结

每天进步一点点,加油!

guid判断是否有效_让我们一起啃算法----有效的括号相关推荐

  1. go数组去除重复_让我们一起啃算法----删除排序链表中的重复元素

    删除排序链表中的重复元素(Remove-Duplicates-From-Sorted-List) 题干: 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1-> ...

  2. java判断括号是否闭合_【python每日一练】有效括号

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

  3. vb6 判断打印机是否有效_吊打面试官 | 算法之如何判断括号是否有效?

    今天要讲的这道题是 bilibili 今年的笔试真题,也是一道关于栈的经典面试题. 经过前面文章的学习,我想很多朋友已经看出来了,我接下来要写的是一个关于「算法图解」的系列文章,中间可能会穿插少量的其 ...

  4. JavaScript实现判断整数是否为2的幂isPowerOfTwo算法(附完整源码)

    JavaScript实现判断整数是否为2的幂isPowerOfTwo算法(附完整源码) isPowerOfTwo.js完整源代码 isPowerOfTwo.js完整源代码 /*** @param {n ...

  5. C语言判断是否为happy number快乐数字的算法(附完整源码)

    C语言判断是否为happy number快乐数字的算法 C语言判断是否为happy number快乐数字的算法完整源码(定义,实现,main函数测试) C语言判断是否为happy number快乐数字 ...

  6. c++判断数字是否为3的倍数的算法实现(附完整源码)

    C++判断数字是否为3的倍数的算法实现 C++判断数字是否为3的倍数的算法实现完整源码(定义,实现,main函数测试) C++判断数字是否为3的倍数的算法实现完整源码(定义,实现,main函数测试) ...

  7. c++判断二个数是否为相反的符号算法实现(附完整源码)

    C++判断二个数是否为相反的符号算法实现 C++判断二个数是否为相反的符号算法实现完整源码(定义,实现,main函数测试) C++判断二个数是否为相反的符号算法实现完整源码(定义,实现,main函数测 ...

  8. c++判断一个数字是否为buzz number的算法(附完整源码)

    C++判断一个数字是否为buzz number的算法 C++判断一个数字是否为buzz number的算法完整源码(定义,实现,main函数测试) C++判断一个数字是否为buzz number的算法 ...

  9. k均值算法 二分k均值算法_如何获得K均值算法面试问题

    k均值算法 二分k均值算法 数据科学访谈 (Data Science Interviews) KMeans is one of the most common and important cluste ...

最新文章

  1. 抓包工具Charles简单使用介绍(可抓取Android中app的请求)
  2. 深度学习100例 - 卷积神经网络(Inception V3)识别手语 | 第13天
  3. genymotion无法安装apk的问题
  4. nc 模拟服务器_NC集群服务器使用详解
  5. python打log_python根据文件大小打log日志
  6. java语言注释符号,高级Java开发必看
  7. 读《NoSQL精粹》前三章有感
  8. eclipse中的TODO和FIXME
  9. win7下关闭wps热点和wps云文档自动漫游的方法
  10. 三大条件致病菌|大肠埃希氏菌、血链球菌、李斯特菌
  11. Java第十九天:mysql(二)
  12. 汽车软件架构学习笔记(一):九问软件架构
  13. 【矩阵论】线性空间与线性变换(1)
  14. CentOS7 开启 BBR 加速
  15. Wijmo JavaScript UI 5.20222.877 Crack
  16. 【B站弹幕数据分析】B站独家付费番剧鬼灭之刃的前12集的弹幕数据分析
  17. 波段测试软件,超好用的波段副图(通达信公式 副图 源码 测试图)
  18. java enum compare_Java中枚举类型
  19. 计算机硬件加速怎么开,怎么开启显卡硬件加速?开启显卡硬件的加速功能步骤...
  20. 三阶行列式的题目_考研数学 | 线性代数中的行列式重难点分析

热门文章

  1. L 苍天阻我寻你,此情坚贞如一(西南科技大学2021届新生赛)(线段树)
  2. CodeCraft-20 (Div. 2) C. Primitive Primes 思维 + 数论
  3. 【CF1189F】Array Beauty【dp】【复杂度玄学优化】
  4. CF1548A Web of Lies
  5. Educational Codeforces Round 112 (Rated for Div. 2)
  6. Double Strings
  7. 【周末狂欢赛6】[AT1219]历史研究(回滚莫队),大魔法师(矩阵+线段树),单峰排列
  8. P5110-块速递推【特征方程,分块】
  9. P4819-[中山市选]杀人游戏【tarjan】
  10. 牛客练习赛52-记录