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:
- Le parentesi aperte devono essere chiuse dallo stesso tipo di parentesi.
- Le parentesi aperte devono essere chiuse nell'ordine corretto.
- 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;
}