当前位置: 首页 > 科技观察

算法图:如何判断括号是否有效?

时间:2023-03-23 10:59:55 科技观察

本文转载自微信公众号“Java中文社区”,作者雷哥。转载本文请联系Java中文社区公众号。今天要说的这道题是今年bilibili笔试的真题,也是一道关于stacks的经典面试题。看了前面几篇文章,相信很多朋友都已经看过了。接下来我要写的是关于“算法图”的系列文章。中间可能会穿插少量其他类型的文章,但是《算法与数据结构》会是我今年文章输出的重点。我在写这个算法系列的时候,会注意两个问题:为了保证大家能够理解算法的解题思路,所以我会以图片的形式来讲解思路,更加直观易懂;在介绍了一个知识点之后,我会做大量的练习来巩固所学的知识。比如我讲完“栈”结构之后,我会围绕“栈”做一系列经典的面试题。学习算法的关键是掌握解决问题的思路。只要思路正确,写出代码只是时间问题。那么,进入今天的正式内容……题目给定一个只包含'(',')','{','}','[',']'的字符串,判断该字符串是否有效。有效的字符串是:左括号必须用相同类型的右括号括起来。左括号必须以正确的顺序闭合。请注意,空字符串被视为有效字符串。示例1:输入:"()"输出:true示例2:输入:"()[]{}"输出:true示例3:输入:"(]"输出:false示例4:输入:"([]{}]"Output:false示例5:Input:"{[]}"Output:true,例如字符串"([{}])"是正确的,应该返回true,而字符串"([{})]"是错误的,应该返回false。从上面的题目可以看出,括号分为圆括号、方括号和花括号三类。那么我们就可以利用栈的先进后出的特性,将所有的左括号(“(”,“[”,“{”)先入栈,遇到右括号时,让它与栈顶元素匹配,比如遇到“)”,如果栈顶是“(”,则表示匹配成功,则栈顶元素出栈继续字符串循环的流程,匹配错误直接返回false。假设我们要匹配字符串“(([]))”,合法吗?那么执行流程是这样的.先遇到左括号,先入栈:再是左括号,继续入栈:再是左括号,继续入栈:接下来是右括号,匹配的是栈顶元素stack,"[]"是合法的一对括号,栈顶元素匹配成功,出栈顶元素:下一个是右括号,匹配栈顶元素。匹配栈顶元素,“()”是一对合法的括号,匹配成功则将栈顶元素弹出出栈:当字符串循环结束,栈为空时,将证明这个字符串的括号匹配是合法的,最终效果如下图所示:那么我们就用代码来实现整个过程……实现代码一publicbooleanisValid(Strings){intslen=s.length();//括号的长度if(slen%2==1){//括号不成对出现,直接返回falsereturnfalse;}//将所有比较的括号存入map,使用Mapmap=newHashMap<>();map.put(')','比较时(');map.put('}','{');map.put(']','[');//定义访问括号的栈(辅助比较)Stackstack=newStack<>();for(inti=0;i