# Time: O(n) # Space: O(1) # Given a string containing only three types of characters: '(', ')' and '*', # write a function to check whether this string is valid. We define the validity of a string by these rules: # 1. Any left parenthesis '(' must have a corresponding right parenthesis ')'. # 2. Any right parenthesis ')' must have a corresponding left parenthesis '('. # 3. Left parenthesis '(' must go before the corresponding right parenthesis ')'. # 4. '*' could be treated as a single right parenthesis ')' or a single left parenthesis '(' or an empty string. # 5. An empty string is also valid. # # Example 1: # Input: "()" # Output: True # Example 2: # Input: "(*)" # Output: True # Example 3: # Input: "(*))" # Output: True # Note: # The string size will be in the range [1, 100]. class Solution(object): def checkValidString(self, s): """ :type s: str :rtype: bool """ lower, upper = 0, 0 # keep lower bound and upper bound of '(' counts for c in s: lower += 1 if c == '(' else -1 upper -= 1 if c == ')' else -1 if upper < 0: break lower = max(lower, 0) return lower == 0 # range of '(' count is valid