Comme cela vient d'un contexte de programmation et non d'un exercice informatique théorique, je suppose qu'il faut de la mémoire pour stocker un index dans la chaîne. En informatique théorique, cela signifierait utiliser le modèle RAM; avec les machines Turing, vous ne pouviez pas faire cela et vous auriez besoin de la mémoire pour stocker un index dans une chaîne de longueur .O(1)Θ(log(n))n
Vous pouvez conserver le principe de base de l'algorithme que vous avez utilisé. Vous avez raté une opportunité d'optimisation de la mémoire.
en utilisant une pile et en parcourant la chaîne une fois en ajoutant des parens à la pile et en les supprimant de la pile chaque fois que je rencontrais une paren de fermeture et que le haut de la pile contenait une paren d'ouverture
Alors, que contient cette pile? Il ne contiendra jamais ()
(une parenthèse ouvrante suivie d'une parenthèse fermante), car chaque fois que )
vous apparaissez, vous sautez au (
lieu de pousser le )
. Ainsi, la pile est toujours de la forme )…)(…(
- un tas de parenthèses fermantes suivi d'un tas de parenthèses ouvrantes.
Vous n'avez pas besoin d'une pile pour représenter cela. N'oubliez pas le nombre de parenthèses fermantes et le nombre de parenthèses ouvrantes.
Si vous traitez la chaîne de gauche à droite, à l'aide de ces deux compteurs, ce que vous avez à la fin est le nombre de parenthèses fermantes incompatibles et le nombre de parenthèses ouvrantes incompatibles.
Si vous souhaitez signaler les positions des parenthèses incompatibles à la fin, vous devez vous souvenir de la position de chaque parenthèse. Cela nécessiterait de la mémoire dans le pire des cas. Mais vous n'avez pas besoin d'attendre la fin pour produire une sortie. Dès que vous trouvez une parenthèse fermante non appariée, vous savez qu'elle n'est pas appariée, alors éditez-la maintenant. Et puis vous n'allez pas utiliser le nombre de parenthèses fermantes incompatibles pour quoi que ce soit, alors gardez simplement un compteur de parenthèses ouvrantes inégalées.Θ(n)
En résumé: traitez la chaîne de gauche à droite. Maintenez un compteur de parenthèses ouvrantes inégalées. Si vous voyez une parenthèse ouvrante, incrémentez le compteur. Si vous voyez une parenthèse fermante et que le compteur est différent de zéro, décrémentez le compteur. Si vous voyez une parenthèse fermante et que le compteur est égal à zéro, sortez l'index actuel sous la forme d'une parenthèse fermante incompatible.
La valeur finale du compteur est le nombre de parenthèses ouvrantes incompatibles, mais cela ne vous donne pas leur position. Notez que le problème est symétrique. Pour répertorier les positions des parenthèses ouvrantes incompatibles, exécutez simplement l'algorithme dans la direction opposée.
Exercice 1: notez-le dans une notation formelle (mathématiques, pseudocode ou votre langage de programmation préféré).
Exercice 2: Convainquez- vous qu'il s'agit du même algorithme que Apass.Jack , juste expliqué différemment.