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

有效括号(Valid-Parentheses)

题干如下:

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

解题思路

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


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

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

流程图如下:

f39036335b6b36b102bea3369f463709.png

代码实现

由于需要基于 这种数据结构来解题,我简单用 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
}

扩展思路

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

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

流程图如下:

0e292c11c8bc97c1836187d4668a7d03.png

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

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
}

总结

每天进步一点点,加油!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/328544.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

小白科普:从输入网址到最后浏览器呈现页面内容,中间发生了什么?

转载自 小白科普&#xff1a;从输入网址到最后浏览器呈现页面内容&#xff0c;中间发生了什么&#xff1f; 1、前言 这篇文章是应网友之邀所写&#xff0c;主要描述一下我们访问网站时&#xff0c; 从输入网址到最后浏览器呈现内容&#xff0c;中间发生了什么。 之前写过两…

面试官角度的JVM面试

一个面试官对JVM面试问题的分析 2017年02月19日 21:51:34 阅读数&#xff1a;18135 标签&#xff1a; 面试官JVM面试问题分析 更多 个人分类&#xff1a; JVM 这个帖子的背景是今晚看到je上这张贴&#xff1a;http://www.iteye.com/topic/715256&#xff0c;心血来潮写下的文…

如何在 ASP.NET MVC 中集成 AngularJS(3)

今天来为大家介绍如何在 ASP.NET MVC 中集成 AngularJS 的最后一部分内容。 调试路由表 - HTML 缓存清除 就在我以为示例应用程序完成之后&#xff0c;我意识到&#xff0c;我必须提供两个版本的路由表&#xff1a;一个运行在调试模式的应用程序下和一个运行在发布模式的应用程…

小菜:关于main方法的面试题

转载自 小菜&#xff1a;关于main方法的面试题问题&#xff1a;如果main方法被声明为private会怎样&#xff1f; 答案&#xff1a;能正常编译&#xff0c;但运行的时候会提示“main方法不是public的”。问题&#xff1a;如果去掉了main方法的static修饰符会怎样&#xff1f; 答…

kali linux改中文_kali linux 2019.4设置为中文方法

就在前天&#xff0c;2019年11月26日&#xff0c;kali Linux官网发布了最新版本&#xff1a;Kali Linux 2019.4发行版&#xff0c;此版本和之前相比变动很大&#xff0c;系统界面、主题、壁纸都灿然一新。Kali Linux2019.4版本包括了一些令人兴奋的新更新:一个新的默认桌面环境…

构建高可用ZooKeeper集群

ZooKeeper 是 Apache 的一个顶级项目&#xff0c;为分布式应用提供高效、高可用的分布式协调服务&#xff0c;提供了诸如数据发布/订阅、负载均衡、命名服务、分布式协调/通知和分布式锁等分布式基础服务。由于 ZooKeeper 便捷的使用方式、卓越的性能和良好的稳定性&#xff0c…

面试官角度弹面试

http://www.iteye.com/topic/715304 这个帖子的背景是今晚看到je上这张贴&#xff1a;http://www.iteye.com/topic/715256&#xff0c;心血来潮写下的文字&#xff0c;如果能抛砖引玉&#xff0c;能有其他面试官分析一下自己面试时问的问题&#xff0c;那或许是件很有意义的事…

面试经历—广州YY(欢聚时代)

转载自 面试经历—广州YY&#xff08;欢聚时代&#xff09; 上周去YY&#xff08;欢聚时代&#xff09;面试JAVA工程师&#xff0c;现在回忆一下当时的面试过程&#xff0c;面试问的问题有&#xff1a;1、常用的集合类HashMap、HashTable、ArrayList、LinkedList、HashSet2、…

mysql binlog 备份恢复数据_Mysql结合备份+binlog恢复误删除操作数据

结合备份binlog恢复数据。场景&#xff1a;昨天晚上做了全备&#xff0c;今天上午用户不小心误删除某张表。解决方案&#xff1a;不建议在原生产环境直接恢复&#xff0c;建议在另一台机器恢复全库日志&#xff0c;然后导入到生产环境。1) 创建表select now();create table itp…

你们也只剩下点赞的交情

作者|北及企鹅 微信|叁禁 01 你们有没有这样的朋友&#xff0c;他们在你的世界里扮演着退化的角色。 也许友谊的开始只是小学一年级的时候他对你说了一声“我也喜欢看小丸子。”你们就手拉手肩并肩当了很久的密友。 也许是因为初中那次你俩都没交作业一起在楼道罚站&#xff0…

IBM® Bluemix 上运行ASP.NET Core

IBM Bluemix 上的“ASP.NET 核心”运行时采用“ASP.NET 核心”buildpack 技术。“ASP.NET 核心”是用于构建 .NET Web 应用程序的模块化开放式源代码框架。“.Net 核心”是跨平台的小型运行时&#xff0c;可由“ASP.NET 核心”应用程序实现。将它们相结合可实现基于云的先进 We…

拦截器 和过滤器

https://blog.csdn.net/zxd1435513775/article/details/80556034 拦截器&#xff08;Interceptor&#xff09;和过滤器&#xff08;Filter&#xff09;的执行顺序和区别 2018年06月03日 13:31:00 止步前行 阅读数&#xff1a;2871 标签&#xff1a; FilterInterceptorControll…

解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别

转载自 解析HTTP协议六种请求方法,get,head,put,delete,post有什么区别 标准Http协议支持六种请求方法&#xff0c;即&#xff1a; 1、GET 2、POST 3、PUT 4、Delete 5、HEAD 6、Options 但其实我们大部分情况下只用到了GET和POST。如果想设计一个符合RESTful规范的web…

攻城掠地端mysql_【图片】攻城掠地单机版本服务端+攻城掠地GM工具【单兆权吧】_百度贴吧...

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼player_wepon 兵器 宝石修改&#xff0e;1&#xff0c;为1级宝石  1001&#xff0c;1级晶石修改最好手动修改&#xff0c;手自进阶  最多改六个一多出错player_tickets  点卷改修activity    活动表store_house  背包表p…

同步和异步有何异同,什么场景使用

同步和异步有何异同&#xff0c;什么场景使用&#xff0c;举例说明&#xff01; 2016年11月30日 18:47:26 qq_36179561 阅读数&#xff1a;1752更多 个人分类&#xff1a; 基础知识 同步:发送一个请求,等待返回,然后再发送下一个请求 异步:发送一个请求,不等待返回,随时可以…

面试经历---YY欢聚时代

转载自 面试经历---YY欢聚时代&#xff08;2015年11月21日上午初试、25日下午复试&#xff09;YY欢聚时代一年多前去面试过一次&#xff0c;当时鄙视了&#xff0c;在现在的公司呆了1年半了&#xff0c;感觉做得很不爽&#xff0c;而且薪资又不满意&#xff0c;所以想找个新工…

走进异步编程的世界 - 开始接触 async/await

序 这是学习异步编程的入门篇。 涉及 C# 5.0 引入的 async/await&#xff0c;但在控制台输出示例时经常会采用 C# 6.0 的 $"" 来拼接字符串&#xff0c;相当于string.Format() 方法。 目录 Whats 异步&#xff1f;async/await 结构What’s 异步方法&#xff1f; 一、…

所有的软弱,都是昂贵的

作者&#xff1a;周冲 来源&#xff1a;周冲的影像声色&#xff08;fuck_your_dick&#xff09; 01 契诃夫有一个小说&#xff0c;名叫《柔弱的人》&#xff0c;讲一个主人&#xff0c;巧立名目&#xff0c;剥夺家庭教师的工资。 首先&#xff0c;他压缩掉她的周末&#xff0c…

python3中urlopen_解决python3 urllib中urlopen报错的问题

前言最近更新了Python版本&#xff0c;准备写个爬虫&#xff0c;意外的发现urllib库中属性不存在urlopen&#xff0c;于是各种google&#xff0c;然后总结一下给出解决方案问题的出现AttributeError: module object has no attribute urlopen问题的解决途径我们先来看下官方文档…

100+经典Java面试题及答案解析

转载自 100经典Java面试题及答案解析面向对象编程&#xff08;OOP&#xff09;Java是一个支持并发、基于类和面向对象的计算机编程语言。下面列出了面向对象软件开发的优点&#xff1a; 代码开发模块化&#xff0c;更易维护和修改。代码复用。增强代码的可靠性和灵活性。增加代…