leetcode_678 有效的括号字符串

126 阅读1分钟

要求

给定一个只包含三种字符的字符串:( ,) 和 *,写一个函数来检验这个字符串是否为有效字符串。有效字符串具有如下规则:

  • 任何左括号 ( 必须有相应的右括号 )。
  • 任何右括号 ) 必须有相应的左括号 ( 。
  • 左括号 ( 必须在对应的右括号之前 )。
  • * 可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
  • 一个空字符串也被视为有效字符串。

示例 1:

输入: "()"
输出: True

示例 2:

输入: "(*)"
输出: True

示例 3:

输入: "(*))"
输出: True

注意:

  • 字符串大小将在 [1,100] 范围内。

核心代码

class Solution:
    def checkValidString(self, s: str) -> bool:
        n = len(s)
        tmp = []
        xin = []
        for i in range(n):
            if "(" == s[i]:
                tmp.append(i)
            elif "*" == s[i]:
                xin.append(i)
            else:
                if 0 == len(tmp):
                    if 0 == len(xin):
                        return False
                    else:
                        del xin[-1]
                else:
                    del tmp[-1]
        while len(tmp) > 0 and len(xin) > 0:
            if tmp[-1] > xin[-1]:
                return False
            else:
                del tmp[-1]
                del xin[-1]
        return 0 == len(tmp)

image.png

解题思路:我们首先先使用两个列表来存储"("和"*", 循环遍历,当我们遇到上面两个字符的时候,我们加入各自的列表,如不是上述字符,我们先看"("的列表中的数量,有则从"("中消除,没有从"*"的列表中消除,都不行,那肯定不是有效的;循环玩一遍之后我们会剩下一些"("和"*",我们比较下数量即可知道,是否有效,因为*可以是一个空字符串,所以"*"数量多余或等于"("的数量都是OK的。