Da wir einfach alle alphanumerischen Zeichen ignorieren können, gehen wir davon aus, dass die Zeichenfolge von nun an nur noch Klammern enthält. Wie in der Frage gibt es nur eine Art von Klammern: "()".
Wenn wir ausgeglichene Klammern so lange entfernen, bis keine ausgeglichenen Klammern mehr entfernt werden können, müssen alle verbleibenden Klammern wie folgt aussehen: ")) ...) ((... ("), die alle unausgeglichene Klammern sind. Diese Beobachtung legt nahe, dass wir zuerst diesen Wendepunkt finden sollten , vor denen wir nur unausgeglichene schließende Klammern haben und nach denen wir nur unausgeglichene öffnende Klammern haben.
Hier ist der Algorithmus. Kurz gesagt, es berechnet zuerst den Wendepunkt. Anschließend wird eine zusätzliche schließende Klammer ausgegeben, in der die Zeichenfolge von Anfang nach rechts bis zum Wendepunkt gescannt wird. Symmetrisch wird eine zusätzliche öffnende Klammer ausgegeben, die vom Ende nach links bis zum Wendepunkt scannt.
strn
Initialisieren turning_point=0, maximum_count=0, count=0. Für jeden ivon 0bis n-1folgendes zu tun.
- Wenn
str[i] = ')', addiere 1 zu count; Andernfalls subtrahieren Sie 1.
- Wenn
count > maximum_count, setzen turning_point=iund maximum_count=count.
Jetzt turning_pointist der Index des Wendepunktes.
Zurücksetzen maximum_count=0, count=0. Für jeden ivon 0bis turning_pointfolgendes zu tun.
- Wenn
str[i] = ')', addiere 1 zu count; Andernfalls subtrahieren Sie 1.
- Wenn
count > maximum_count, setzen maximum_count = count. Ausgabe ials Index einer unausgeglichenen schließenden Klammer.
Zurücksetzen maximum_count=0, count=0. Führen Sie für jedes ivon n-1bis turning_point+1nach unten die folgenden Schritte aus .
- Wenn
str[j] = '(', addiere 1 zu count; Andernfalls subtrahieren Sie 1.
- Wenn
count > maximum_count, setzen maximum_count = count. Ausgabe ials Index einer unausgeglichenen öffnenden Klammer.
O ( n )O ( 1 )O ( u )u
Wenn wir den obigen Algorithmus analysieren, werden wir sehen, dass wir den Wendepunkt überhaupt nicht finden und verwenden müssen. Die nette Beobachtung, dass alle unausgeglichenen schließenden Klammern vor allen unausgeglichenen öffnenden Klammern auftreten, kann ignoriert werden, obwohl dies interessant ist.
Klicken Sie einfach auf "Ausführen", um mehrere Testergebnisse anzuzeigen.
Übung 1. Zeigen Sie, dass der obige Algorithmus einen Satz von Klammern mit der geringsten Kardinalität ausgibt, sodass die verbleibenden Klammern ausgeglichen sind.
Problem 1. Können wir den Algorithmus auf den Fall verallgemeinern, dass die Zeichenfolge zwei Arten von Klammern enthält, z. B. "() []"? Wir müssen bestimmen, wie die neue Situation, der Verschachtelungsfall "([)]", erkannt und behandelt werden soll.