前往此题

解题思路

要解这道题,首先得看懂题目中的五个条件

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

从中我们可以知道一下几个因素:

  1. 当左括号在右括号之后,类似于这样)(,这种就不是有效括号
  2. 当存在多个左括号或者右括号并且数量多于*时不是有效括号
  3. *不在左括号右边那必然不是有效括号

代码

class Solution:
    def checkValidString(self, s: str) -> bool:
        if not s: return False
        stack = []
        stars = []

        for i in range(len(s)):
            if s[i] == "(": stack.append(i)
            if s[i] == "*": stars.append(i)
            if s[i] == ")": 
                if stack: stack.pop()
                elif stars: stars.pop()
                else: return False
        
        while stack:
            if not stars: return False
            elif stack[-1] > stars[-1]: return False
            else:
                stack.pop()
                stars.pop()
        return True