Problem Description
Given a string s containing only three types of characters: ’(’, ’)’ and ’*’, return true if s is valid.
The following rules define a valid string:
- Any left parenthesis
’(’must have a corresponding right parenthesis’)‘. - Any right parenthesis
’)’must have a corresponding left parenthesis’(‘. - Left parenthesis
’(’must go before the corresponding right parenthesis’)’. ’*’could be treated as a single right parenthesis’)’or a single left parenthesis’(’or an empty string"".
Example 1:
Input: s = ”()” Output: true
Example 2:
Input: s = ”(*)” Output: true
Example 3:
Input: s = ”(*))” Output: true
Constraints:
1 <= s.length <= 100s[i]is’(’,’)’or’*‘.
Difficulty: Medium
Tags: string, dynamic programming, stack, greedy
Rating: 97.01%
Solution
Here’s my Python solution to this problem:
class Solution:
def checkValidString(self, s: str) -> bool:
min_open = max_open = 0
for c in s:
if c == "(":
min_open += 1
max_open += 1
elif c == ")":
min_open -= 1
max_open -= 1
else: # c == '*'
min_open -= 1 # treat as ')'
max_open += 1 # treat as '('
# If max becomes negative, we have too many ')'
if max_open < 0:
return False
# min_open can't be negative
min_open = max(0, min_open)
return min_open == 0 # possible to have no open parentheses
Example Walkthrough
Let’s walk through the example "(*)" step by step:
-
Initial state:
min_open = 0, max_open = 0 -
Process
'(':min_open = 1(must be treated as open parenthesis)max_open = 1(must be treated as open parenthesis)
( → min_open = 1, max_open = 1 -
Process
'*':min_open = 0(could be treated as closing parenthesis)max_open = 2(could be treated as opening parenthesis)
(* → min_open = 0, max_open = 2 -
Process
')':min_open = -1→ adjusted to 0 (minimum can’t be negative)max_open = 1
(*) → min_open = 0, max_open = 1 -
Final check:
min_open == 0is true, so returntrue
Why This Works
The solution works because:
- If
max_openbecomes negative, we have too many)and no valid solution exists - If
min_openis 0 at the end, there exists at least one way to assign*characters to make the string valid - By keeping track of both minimum and maximum possible open parentheses, we cover all possible combinations of
*interpretations
Complexity Analysis
- Time Complexity: where n is the length of the string
- Space Complexity: as we only use two variables regardless of input size