力扣20. 有效的括号

简介: 力扣20. 有效的括号

力扣20. 有效的括号

一、题目描述:

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

有效字符串需满足:

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

示例 1:

输入:s = "()"输出:true示例 2:

输入:s = "()[]{}"输出:true示例 3:

输入:s = "(]"输出:false示例 4:

输入:s = "([)]"输出:false示例 5:

输入:s = "{[]}"输出:true

提示:

1 <= s.length <= 10^4s 仅由括号 '()[]{}' 组成

来源:力扣(LeetCode)链接:https://leetcode-cn.com/problems/valid-parentheses著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、思路分析:

这道题考察了什么思想?你的思路是什么?

  1. 我认为这道题目是简单的栈的使用,但是好久没用栈,都生疏了。因为我们每次遇到一个左括号,都入栈,然后遇到相同类型的右括号就出栈。因为后来的左括号需要相应的右括号先来,所以我们将后来的左括号放入栈顶。

做题的时候是不是一次通过的,遇到了什么问题,需要注意什么细节?

  1. 不是,第一次编写的代码如下,出现了问题,提交报错“Line 23: Char 17: runtime error: index -128 out of bounds for type 'char [*]' [solution.c]”。

charHashMap(charch){

   if(ch=='}') return'{';

   if(ch==')') return'(';

   if(ch==']') return'[';

   return0;

}

 

boolisValid(char*s){

   intn=strlen(s);

   if(n%2==1){

       returnfalse;

   }

 

   chartemp[n+1],top=0;

   for(inti=0;i<n;i++){

       if(HashMap(s[i]) !=0){

           if(top==0||temp[top-1] !=HashMap(s[i])){

               returnfalse;

           }

           top--;

       }

       else{

           temp[top++] =s[i];

       }

   }

   if(top==0){

       returntrue;

   }else{

       returnfalse;

   }

}

  1. 但是我在本地Clion中输入那个测试用例又可以运行,真是头疼,于是我开始仔细阅读代码,终于发现了一个地方有问题。

chartemp[n+1],top=0;

  1. top应该是int类型,于是一改。。。
    果然通过了。。。。

有几种解法,哪种解法时间复杂度最低,哪种解法空间复杂度最低,最优解法是什么?其他人的题解是什么,谁的效率更好一些?用不同语言实现的话,哪个语言速度最快?

  1. 本身是Python选手,看到了大佬写的Python解法,我自愧不如。

classSolution:

   defisValid(self, s: str) ->bool:

       dic = {'{': '}',  '[': ']', '(': ')', '?': '?'}

       stack = ['?']

       forcins:

           ifcindic: stack.append(c)

           elifdic[stack.pop()] != c: returnFalse

       returnlen(stack) == 1

 

作者:jyd

链接:https://leetcode-cn.com/problems/valid-parentheses/solution/valid-parentheses-fu-zhu-zhan-fa-by-jin407891080/

来源:力扣(LeetCode)

著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

  1. 这代码如此Pythonic

三、AC 代码:

charHashMap(charch){

   if(ch=='}') return'{';

   if(ch==')') return'(';

   if(ch==']') return'[';

   return0;

}

 

boolisValid(char*s){

   intn=strlen(s);

   if(n%2==1){

       returnfalse;

   }

 

   chartemp[n+1];

   inttop=0;

   for(inti=0;i<n;i++){

       if(HashMap(s[i])){

           if(top==0||temp[top-1] !=HashMap(s[i])){

               returnfalse;

           }

           top--;

       }

       else{

           temp[top] =s[i];

           top++;

       }

   }

   if(top==0){

       returntrue;

   }else{

       returnfalse;

   }

}

四、总结:

如果学栈的相关知识,这道题目应该是入门必做的!

目录
相关文章
|
4月前
|
存储 C语言 索引
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
环形链表、环形链表 II、有效的括号​​​​​​​【LeetCode刷题日志】
|
1月前
|
算法
LeetCode第22题括号生成
该文章介绍了 LeetCode 第 22 题括号生成的解法,通过回溯算法生成所有可能的括号组合,在递归过程中根据左右括号数量的条件进行剪枝,从而得到有效的括号组合。
LeetCode第22题括号生成
|
1月前
|
存储 算法
LeetCode第20题有效的括号
该文章介绍了 LeetCode 第 20 题有效的括号的解法,通过分析有效括号的特征,使用栈结构存储括号关系,判断遇到右边括号时栈顶是否有匹配的左边括号,从而解决问题,同时总结了栈的先进后出结构可用于解决有规律的符号匹配问题。
LeetCode第20题有效的括号
|
1月前
|
算法 Python
【Leetcode刷题Python】括号匹配问题
一种解决括号匹配问题的Python实现方法,通过计算给定括号串的所有子串的最长合法括号子序列长度之和来确定权值。
14 0
|
1月前
|
机器学习/深度学习 Python
【Leetcode刷题Python】22. 括号生成
本文介绍了了LeetCode题目22的两种Python编程解决方案,题目要求生成所有可能的且有效的括号组合,包括暴力求解和回溯方法。
17 0
|
1月前
|
Python
【Leetcode刷题Python】20. 有效的括号
LeetCode上题目“20. 有效的括号”的Python解决方案,使用栈数据结构来验证括号序列的有效性。具体实现中,会在栈中预先放置一个特殊字符以避免在弹出操作时出现空栈错误,并通过匹配左右括号来判断括号序列是否有效。
16 0
|
2月前
|
算法 测试技术
力扣经典150题第五十一题:有效的括号
力扣经典150题第五十一题:有效的括号
23 0
|
3月前
|
算法 Java C语言
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
【经典算法】LeetCode 20:有效的括号(Java/C/Python3实现含注释说明,Easy)
31 1
LeetCode | 20. 有效的括号
LeetCode | 20. 有效的括号
|
3月前
|
算法
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成
【经典LeetCode算法题目专栏分类】【第11期】递归问题:字母大小写全排列、括号生成