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].
// )( *)
//(
//)
//(

func checkValidString(s string) bool {
    if len(s) == 0 || (len(s)== 1 && s[0] =='*'){
        return true
    }
    l,cp := 0, 0
    
    for _,c := range s {
        switch {
            case c == '(':
                l++;
                cp++
            case c == '*':
                if l > 0 {
                    l--
                }
                cp++
            case c == ')':
                if l>0 {
                    l--
                }
                cp--
                if cp < 0 {
                    return false
                }
        }
    }

    return   l == 0 
}