One approach is to use a stack to keep track of the opening parentheses and the asterisks. Whenever a closing parenthesis is encountered, the stack is checked in the following order: match it with an opening parenthesis on top of the stack, if not match it with an asterisk on top of the stack, if not return False. At the end, if the stack still contains opening parentheses, then it is also invalid.

Here's the implementation in Python:

```
def checkValidString(s: str) -> bool:
    stack = []
    asterisk = []
    for i, char in enumerate(s):
        if char == '(':
            stack.append(i)
        elif char == '*':
            asterisk.append(i)
        else: #closing parenthesis
            if not stack and not asterisk:
                return False
            elif stack:
                stack.pop()
            else: #use asterisk as opening parenthesis
                asterisk.pop()
    while stack and asterisk:
        if stack.pop() > asterisk.pop():
            return False
    return not stack #if there's no more opening parenthesis left, it's valid
```
Data una stringa contenente solo tre tipi di caratteri: '(', ')' e '*', scrivere una funzione per verificare se questa stringa è valida. Definiamo la validità di una stringa in base a queste regole: Ogni parentesi aperta '(' deve avere una corrispondente parentesi aperta ')'. Ogni parentesi aperta ')' deve avere una corrispondente parentesi aperta '('. La parentesi aperta '(' deve precedere la corrispondente parentesi aperta ')'. '*' può essere trattata come una singola parentesi chiusa ')' o una singola parentesi aperta parentesi '(' o una stringa vuota. È valida anche una stringa vuota.
Suggerisci una soluzione per questo problema leetcode e poi implementala in python.