"Suggerisci una soluzione per questo problema di LeetCode."
Data una stringa contenente solo tre tipi di caratteri: '(', ')', e '*', scrivi una funzione per verificare se questa stringa è valida. Definiamo la validità di una stringa con queste regole:

Ogni parentesi aperta '(' deve avere una parentesi chiusa corrispondente ')'.
Ogni parentesi chiusa ')' deve avere una parentesi aperta corrispondente '('.
La parentesi aperta '(' deve precedere la parentesi chiusa corrispondente ')'.
'*' può essere trattato come una singola parentesi chiusa ')' o una singola parentesi aperta '(' o una stringa vuota.

Una stringa vuota è anche valida.
classe Soluzione:
    def checkValidString(self, s: str) -> bool:
        open_stack = []
        star_stack = []
        for i, char in enumerate(s):
            
            # Aggiungi parentesi aperte a open_stack e asterischi a star_stack
            if char == "(":
                open_stack.append(i)
            elif char == "*":
                star_stack.append(i)
                
            # Controlla le parentesi aperte o gli asterischi correnti, rimuovili nel caso in cui corrispondano alla parentesi di chiusura
            # Se non viene trovata una parentesi corrispondente, allora l'espressione non è valida.
            elif char == ")":
                if open_stack:
                    open_stack.pop()
                elif star_stack:
                    star_stack.pop()
                else:
                    return False

        # Controlla la lunghezza degli stack rimanenti
        while open_stack and star_stack:
            o = open_stack.pop()
            s = star_stack.pop()

            if o > s:
                return False

        return len(open_stack) == 0