Given a string s
containing only three types of characters: '('
, ')'
, and ('*'
, write a function to check whether the string is valid. The string is considered valid if it can be converted to an empty string by applying the following rules:
'('
must have a corresponding right parenthesis ')'
.')'
must have a corresponding left parenthesis '('
.'('
must go before the corresponding right parenthesis ')'
.')'
or a single left parenthesis '('
or an empty string ""
.Your task is to implement the function checkValidString(s: str) -> bool
.
s
be empty?
s
?
To solve this problem, we’ll use a greedy algorithm with two counters:
low
: Represents the minimum number of open parentheses that must be closed.high
: Represents the maximum possible number of open parentheses.We iterate through the string, updating low
and high
based on the character:
'('
, increment both low
and high
.')'
, decrement both low
and high
.'*'
, decrement low
(treat '*'
as ')'
or ''
) and increment high
(treat '*'
as '('
).After processing the string:
low
must be zero (i.e., no unbalanced open parentheses are guaranteed required).high
must not be negative during traversal.def checkValidString(s: str) -> bool:
low = 0
high = 0
for char in s:
if char == '(':
low += 1
high += 1
elif char == ')':
if low > 0:
low -= 1
high -= 1
elif char == '*':
if low > 0:
low -= 1
high += 1
if high < 0:
return False
return low == 0
# Example Usage:
print(checkValidString("()")) # True
print(checkValidString("(*)")) # True
print(checkValidString("(*))")) # True
print(checkValidString("((*)")) # True
""
should return True
."())*", "(*))((*)"
.Got blindsided by a question you didn’t expect?
Spend too much time studying?
Or simply don’t have the time to go over all 3000 questions?