解题思路
要解这道题,首先得看懂题目中的五个条件
- 任何左括号 ( 必须有相应的右括号 )。
- 任何右括号 ) 必须有相应的左括号 ( 。
- 左括号 ( 必须在对应的右括号之前 )。
- *可以被视为单个右括号 ) ,或单个左括号 ( ,或一个空字符串。
- 一个空字符串也被视为有效字符串。
从中我们可以知道一下几个因素:
- 当左括号在右括号之后,类似于这样
)(
,这种就不是有效括号 - 当存在多个左括号或者右括号并且数量多于
*
时不是有效括号 - 当
*
不在左括号右边那必然不是有效括号
代码
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