11.有效的括号-Leetcode 020(python)

  • 题目描述

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

有效字符串需满足:

左括号必须用相同类型的右括号闭合。
左括号必须以正确的顺序闭合。
注意空字符串可被认为是有效字符串。

  • 示例

示例 1:

输入: “()”
输出: true
示例 2:

输入: “()[]{}”
输出: true
示例 3:

输入: “(]”
输出: false

  • 解决方案

本想自己解决,但是用了一堆if else的判断最后把自己都快搞疯掉也不能AC,看了网上的解决方案,意识到自己的问题在于老想着用最笨的方法去遍历记录,对数据结构的理解、掌握和应用不到位,效率低,效果差。

参考的解决方案使用的思路是用栈的数据结构来解决,如果当前字符是左括号,则直接放入栈中,如果是右括号,那么就判断此时栈里的字符是否是与之对应的左括号,如果不是的话则返回False,要注意如果此时栈是空的,也是返回False。

另外需要注意的是有可能会出现字符串中只有左括号的情况,栈不为空,但是返回的是False。一开始做的时候没有考虑到这个,报错了。

  • 代码
class Solution:
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """
        
        l = len(s)
        if l ==0 :
            return True
        #如果字符个数为奇数,直接返回False
        elif l%2 ==1:
            return False
        
        d = {'(':')','[':']','{':'}'}
        #栈
        stack = []
        
        for i in s:
            #如果当前字符为左括号,则直接加入栈中
            if i in d:
                stack.append(i)
            #如果当前字符为右括号
            else:
                if not stack:
                    return False
                else:
                    #判断当前栈中是否有与当前右括号相匹配的左括号
                    if d[stack.pop()] != i:
                        return False
                    
        #之所以判断栈此时是否为空,是要考虑字符串是'(('的情况
        if stack == []:
            return True
        else:
            return False

 

点赞