Leetcode020 有效的括号

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

有效字符串需满足:

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

注意空字符串可被认为是有效字符串。

示例 1:

输入: "()"
输出: true

示例 2:

输入: "()[]{}"
输出: true

示例 3:

输入: "(]"
输出: false

示例 4:

输入: "([)]"
输出: false

示例 5:

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

有效的括号这个题的变种在之前也看过。这次用python练习一下。

括号左右配对,必然想到的是用栈来实现。遇到左括号压进去,遇到右括号就弹出一个左括号,检查能不能与这个右括号匹配。不能就FALSE。很快写好了第一版的程序:

class Solution:
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """

        if s == '':
            return True

        list_left = ['(', '{', '[']
        list_right = [')', '}', ']']

        if s[0] in list_right:  # 第一个字符是右括号,肯定不符合顺序的要求了
            return False

        stack = []
        for element in s:
            if element in list_left:  # 是左括号就入栈
                stack.append(element)

            if element in list_right:  # 是右括号就出栈
                end_element = stack.pop()  # 默认删除最后一个元素,相当于弹出
                if list_left.index(end_element) != list_right.index(element):   # 弹出的最后一个左括号和当前的右括号不匹配
                    return False

        return True
第一次提交,报错,输入是'[])'时由空栈弹出了。看到这个错突然想到两个问题,一是s长度为奇数的话,必然不对称,直接返回False就好;二是需要加判断,遇到右括号时,得判断栈是不是空,空了就直接False得了。

第二次提交,报错,输入是'(('时结果应该是False,我的是True。嗯……循环结束的时候应该判断栈空不空,不空就是这种情况,全是左括号但也不匹配;空了才应该返回True。

第三次提交终于过了。附源代码:

class Solution:
    def isValid(self, s):
        """
        :type s: str
        :rtype: bool
        """

        if s == '':
            return True
        if len(s) % 2 == 1:  # 奇数个字符,肯定不对称
            return False

        list_left = ['(', '{', '[']
        list_right = [')', '}', ']']

        if s[0] in list_right:  # 第一个字符是右括号,肯定不符合顺序的要求了
            return False

        stack = []
        for element in s:
            if element in list_left:  # 是左括号就入栈
                stack.append(element)

            if element in list_right:  # 是右括号就出栈
                if len(stack) == 0:  # 这时候已经是空栈
                    return False
                else:
                    end_element = stack.pop()  # 默认删除最后一个元素,相当于弹出
                    if list_left.index(end_element) != list_right.index(element):   # 弹出的最后一个左括号和当前的右括号不匹配
                        return False

        if len(stack) == 0:  # 循环结束了,栈也空了,说明全部匹配上了
            return True
        else:   # 循环结束了,栈还没空,说明剩一堆左括号没匹配上
            return False

网上看到一个比较简洁的写法是这样的(没带函数头):

        a = {')':'(', ']':'[', '}':'{'}
        l = [None]#设置None是为了排除空值的情况!
        for i in s:
            if i in a and a[i] == l[-1]:
                l.pop()
            else:
                l.append(i)
        return len(l)==1#用来排除空值的情况

用了字典反向匹配。如果有'[]))'的情况,')'也会append到栈里去,但最后只要判断栈是不是为空就好了。None是个特殊的常量,None的类型是Nonetype,但它不是空字符串也不是空列表。可它还是个量,所以最后判断的时候看的是长度是不是1。

就这些,有空继续刷题!


猜你喜欢

转载自blog.csdn.net/u014292401/article/details/80949872