这个题解使用两个栈 l 和 sign 分别存储左括号 '(' 和星号 '*' 的下标。遍历字符串,遇到左括号入栈 l,遇到星号入栈 sign,遇到右括号则优先弹出 l 栈顶元素,若 l 为空则弹出 sign 栈顶元素,若 sign 也为空说明没有左括号与当前右括号匹配,返回 false。最后从 l 和 sign 的栈顶开始比较下标,若 l 栈顶元素下标大于 sign 栈顶元素的下标,说明无法匹配,返回 false。若最终 l 栈为空则说明所有的左括号都被匹配,字符串有效,返回 true。
时间复杂度: O(n)
空间复杂度: O(n)
class Solution:
def checkValidString(self, s: str) -> bool:
l, sign = [], [] # l 栈存储左括号下标,sign 栈存储星号下标
for i in range(len(s)):
if s[i] == "(":
l.append(i) # 遇到左括号,下标入栈 l
elif s[i] == ")":
if l:
l.pop() # 遇到右括号,优先弹出 l 栈顶元素
elif sign:
sign.pop() # l 为空则弹出 sign 栈顶元素
else:
return False # l 和 sign 都为空,没有括号匹配,返回 false
else:
sign.append(i) # 遇到星号,下标入栈 sign
i, j = len(l)-1, len(sign)-1
while i >= 0 and j >= 0: # 从 l 和 sign 栈顶开始比较下标
if l[i] < sign[j]: # 若 l 栈顶元素下标小于 sign 栈顶元素的下标
i -= 1 # l 和 sign 栈顶元素都不再考虑
j -= 1
else:
return False # 若 l 栈顶元素下标大于 sign 栈顶元素下标,则无法匹配,返回 false
return i < 0 # 若最终 l 中所有左括号都被匹配,则字符串有效,返回 true