J'ai récemment été confronté à ce problème intéressant. On vous donne une chaîne de caractères contenant uniquement les caractères '('
, ')'
, '{'
, '}'
, '['
et ']'
par exemple, "[{()}]"
vous devez écrire une fonction qui vérifiera la validité d'une telle chaîne d'entrée, la fonction peut être comme ceci :bool isValid(char* s);
ces parenthèses doivent être fermées dans le bon ordre, par exemple "()"
et "()[]{}"
sont toutes valides mais "(]"
, "([)]"
et "{{{{"
ne le sont pas !
J'ai trouvé une solution de complexité O(n) en temps et O(n) en espace, qui fonctionne bien :
- Maintenir une pile de caractères.
- Chaque fois que vous trouvez un appareil dentaire ouvert
'('
,'{'
OU'['
le pousser sur la pile. - Chaque fois que vous trouvez un appareil dentaire fermé
')'
,'}'
OU']'
Vérifiez si le sommet de la pile correspond à la parenthèse ouvrante, si oui, ouvrez la pile, sinon interrompez la boucle et retournez false. - Répétez les étapes 2 - 3 jusqu'à la fin de la ficelle.
Cela fonctionne, mais pouvons-nous l'optimiser pour l'espace, peut-être un espace supplémentaire constant, je comprends que la complexité en temps ne peut pas être inférieure à O(n) car nous devons regarder chaque caractère.
Ma question est donc de savoir si nous pouvons résoudre ce problème dans un espace O(1).