PHP: risolvere un semplice esercizio di programmazione

PHP: risolvere un semplice esercizio di programmazione

In questo articolo vedremo una possibile soluzione ad un semplice esercizio di programmazione in PHP.

Data una stringa s contenente solo i caratteri '(', ')', '{', '}', '[' e ']', stabilire se la stringa di input è valida.

Una stringa di input è valida se:

  1. Le parentesi aperte devono essere chiuse dallo stesso tipo di parentesi.
  2. Le parentesi aperte devono essere chiuse nell'ordine corretto.
  3. Ogni parentesi chiusa ha una corrispondente parentesi aperta dello stesso tipo.

Esempio 1:

Input: s = "()"
Output: true

Esempio 2:

Input: s = "()[]{}"
Output: true

Esempio 3:

Input: s = "(]"
Output: false

La stringa di input non deve avere più di 104 caratteri e deve essere costituita solo dalle parentesi '()[]{}'.

Si tratta sostanzialmente di effettuare la scansione della stringa carattere per carattere tenendo traccia del carattere corrente e del carattere immediatamente successivo.


 function is_valid($s = '') {
    if(empty($s)) {
        return false;
    }
    $allowed_chars = ['(', ')', '{', '}', '[', ']'];
    $valid = true;
    $len = strlen($s);

    if($len === 0 || $len > 104) {
        return false;
    }

    for($i = 0; $i < $len; $i++) {
        if(!in_array($s[$i], $allowed_chars)) {
            $valid = false;
        }
    }

    $j = 0;

    while($j < $len) {
        
        $ch = $s[$j];
        $next_i = $j + 1;
        $next = $next_i < $len ? $s[$next_i] : null;
        if(is_null($next)) {
            break;
        }
        switch($ch) {
            case '(':
                if($next !== ')') {
                    $valid = false;
                }
                break;
            case '{':
                if($next !== '}') {
                    $valid = false;
                } 
                break;
            case '[':
                if($next !== ']') {
                    $valid = false;
                }       
                break;
            default:
                break;    
        }

        $j++;
    }

    return $valid;
}
Torna su