👨🎓作者:bug菌 ✏️博客:CSDN、掘金等 💌公众号:猿圈奇妙屋 🚫特别声明:原创不易,转载请附上原文出处链接和本文声明,谢谢配合。 🙏版权声明:文章里可能部分文字或者图片来源于互联网或者百度百科,如有侵权请联系bug菌处理。
题目: 给定一个只包括 '(',')','{','}','[',']' 的字符串 s ,判断字符串是否有效。 有效字符串需满足: 左括号必须用相同类型的右括号闭合。 左括号必须以正确的顺序闭合。
具体请看如下事例:
示例 1:
输入:s = "()"
输出:true
示例 2:
输入:s = "()[]{}"
输出:true
示例 3:
输入:s = "(]"
输出:false
示例 4:
输入:s = "([)]"
输出:false
示例 5:
输入:s = "{[]}"
输出:true
题目来源:LeetCode官网难度:⭐⭐
一看到这题,就给了我一种错觉,计算左右括号的数量,然后判断每种左右括号相同,就是有效括号了吧。其实非也,比如 [{]},明显是各种左右括号都相等,但却不是有效的,因为有效还得跟位置有关系。
所以当我仔细观察,却发现了一个特点,跟栈先入后出的特别非常吻合,即若遇到左括号入栈,遇到右括号时将对应栈顶左括号出栈即可,所以只需遍历完所有括号后 stack
仍然为空,这就说明括号是有效的。
所以算法思路就是:遍历字符串 str,然后分情况:
如上动画就是结合栈的特点来验证该括号是否有效的一个过程,最终栈空就表示该括号是有效的,栈不为空,则表示该括号无效。
具体算法代码实现如下:
class Solution {
public boolean isValid(String s) {
//1.为空或奇数直接跳过
if(s.isEmpty() || s.length() % 2 == 1) {
return false;
}
//2.创建辅助栈
Stack<Character> stack = new Stack<>();
//3.遍历
for(char c : s.toCharArray()){
if(c == '('){
stack.push(')');
}else if(c == '['){
stack.push(']');
}else if(c == '{'){
stack.push('}');
}else if(stack.isEmpty() || c != stack.pop()){
return false;
}
}
//4.返回
return stack.isEmpty();
}
}
复杂度分析:
总而言之,这题其实考察的就是栈的特点,如果对栈有些基本了解,那么这题就迎刃而解啦,重点就是利用栈先进后出的特点来解题,其他倒没啥。再者,解题道路千万条,小伙伴们,如果你们有啥更好的想法或者解题思路,欢迎评论区告诉我哦,大家一起互相借鉴互相学习,方能成长的更快。
好啦,以上就是本期的所有内容啦,咱们下期见咯。