mirror of
https://github.com/devenperez/leetcode.git
synced 2026-06-13 03:27:07 +00:00
Time: 0 ms (100%), Space: 17.6 MB (82.62%) - LeetHub
This commit is contained in:
@@ -0,0 +1,61 @@
|
|||||||
|
class Solution:
|
||||||
|
def checkValidString(self, s: str) -> bool:
|
||||||
|
"""
|
||||||
|
Complexities:
|
||||||
|
Time: O(n)
|
||||||
|
Space: O(n)
|
||||||
|
|
||||||
|
where n = len(s)
|
||||||
|
"""
|
||||||
|
|
||||||
|
bracketCount = 0
|
||||||
|
starCount = 0
|
||||||
|
starIndecies = []
|
||||||
|
usedStars = 0
|
||||||
|
|
||||||
|
# Forward pass - allocate as many *s to be (
|
||||||
|
# - when allocating a star, always use the star that appears first
|
||||||
|
for i, l in enumerate(s):
|
||||||
|
if l == '(':
|
||||||
|
bracketCount += 1
|
||||||
|
elif l == '*':
|
||||||
|
starCount += 1
|
||||||
|
starIndecies.append(i)
|
||||||
|
elif bracketCount > 0:
|
||||||
|
bracketCount -= 1
|
||||||
|
elif starCount > 0:
|
||||||
|
starCount -= 1
|
||||||
|
usedStars += 1
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# There are already matching opening/closing brackets
|
||||||
|
# - all stars are assigned empty string
|
||||||
|
if bracketCount == 0:
|
||||||
|
return True
|
||||||
|
|
||||||
|
# There are more closed brackets needed than the amount of remaining stars
|
||||||
|
if bracketCount > 0 and bracketCount > starCount:
|
||||||
|
return False
|
||||||
|
|
||||||
|
# Backward pass - allocate as many *s to be )
|
||||||
|
# - the first `usedStars` stars are considered used from the forward pass
|
||||||
|
firstViableStar = starIndecies[usedStars]
|
||||||
|
bracketCount = 0
|
||||||
|
starCount = 0
|
||||||
|
for i in range(len(s) - 1, 0, -1):
|
||||||
|
l = s[i]
|
||||||
|
|
||||||
|
if l == ')':
|
||||||
|
bracketCount += 1
|
||||||
|
elif l == '*':
|
||||||
|
starCount += 1 if i >= firstViableStar else 0
|
||||||
|
elif bracketCount > 0:
|
||||||
|
bracketCount -= 1
|
||||||
|
elif starCount > 0:
|
||||||
|
starIndecies.pop(0)
|
||||||
|
starCount -= 1
|
||||||
|
else:
|
||||||
|
return False
|
||||||
|
|
||||||
|
return True
|
||||||
Reference in New Issue
Block a user