Wie finden Sie das passende paar von geschweiften Klammern in einem string?
Angenommen ich habe einen string "(bezahlt) + (8 Arbeitsstunden) + (Unternehmens-Regeln)" . Jetzt möchte ich prüfen, ob der komplette string ist umgeben mit Klammern oder nicht. Grundsätzlich möchte ich überprüfen, ob der string ist wie dieser oder nicht : "((bezahlt) + (8 Arbeitsstunden) + (Unternehmens-Regeln))". Wenn es schon mit Klammern umgeben, dann werde ich es belassen, wie es ist, sonst werde ich anwenden Klammern, um die vollständige Zeichenfolge, so dass die Ausgabe lautet : "((bezahlt) + (8 Arbeitsstunden) + (Unternehmens-Regeln))" . Durch zählen der Anzahl von Klammern, ich bin nicht in der Lage, dieses problem zu lösen.
Kann bitte jemand eine Lösung vorschlagen?
Klammern, nicht Klammern. (Sorry, meine OCD getreten.) Sowieso: "(dies ist ein test-string)" count as "umgeben mit Klammern"?
WENN Sie wissen, das format der Zeichenfolge ist, warum nicht einfach überprüfen
((
am Anfang der Zeichenfolge und der ))
am Ende?eigentlich sind strings aus einer Datenbank stammen, also ich weiß nicht Ihr format.
So macht "(dies ist ein test-string)" zählen oder nicht?
InformationsquelleAutor user2091061 | 2013-03-01
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den
Stack
ist eine gute Idee, aber wie Sie wollen, um zu sehen, wenn der komplette string ist umgeben mit parens, ich schlage vor, Sie setzen die index der angetroffenen öffnung Klammer auf derStack
. So, jedes mal, wenn Sie pop ein Element auf den stack, überprüfen Sie, ob es0
, die Bedeutung der Eröffnung Teil, entspricht diesem abschließenden Teil wurde auf den Anfang der Zeichenkette. Das Ergebnis dieser überprüfung für die Letzte schließende Klammer wird Ihnen sagen, wenn Sie brauchen, um hinzuzufügen, parens.Beispiel:
(paid for) + (8 working hours) + (company rules)
? Es wird der erste pop-und index gleich 0 ist, richtig? Aber der string ist nicht umgeben von ( ).Es spielt keine Rolle, weil das flag wird auf false gesetzt werden wiederum durch die folgenden pops.
Du hast Recht - ich sah
break
und dachte, das beenden der Schleife. Schön gemacht. +1Danke...!! dieser arbeitet.....
Du bist herzlich willkommen 🙂 Bitte nicht, dass ich versehentlich setzen
-1
undstack.Pop()
an den falschen stellen nachstack.Any()
. Behoben, jetzt.InformationsquelleAutor Botz3000
verwenden einen stack.. wie, wenn u finden ( Halterung schieben und wenn u sehen ) pop stack..
Schließlich, wenn der string geparst wird vollständig der stack sollte leer sein... Dies wird sicherstellen Sie, dass die Klammern nicht fehlen..
in Ihrem Fall, wenn zwischen der stack leer ist, dann gibt es keine umgebenden Klammern für die gesamte Zeichenfolge
zum Beispiel:
for input string:
den ersten ( würde geschoben werden und wenn es auf das ) wird es pop auf dem stack, überprüfen Sie nun, wenn es mehr string geparst, und der Stapel ist nicht leer. Wenn stack leer ist, bedeutet das, dass der gesamte string nicht in die Halterung.
in der Erwägung, dass für den string:
stack nicht leer sein, bis auch der Letzte ) wird angezeigt.
Hoffe, das hilft...
Gute Idee, außer ist es nicht ganz das problem zu lösen. OP braucht, um zu erkennen, ob die äußere ( ) da sind, oder nicht. Wenn Sie sind, wird der Stapel noch 0 Elemente, wenn der string geparst wird.
aber wenn Zeichenfolge : "(bezahlt) + (8 Arbeitsstunden) + (Unternehmens-Regeln)" , dann in diesem Fall auch stapeln würde leer sein, da die Zahnspange angepasst haben. Aber ich möchte, um zu überprüfen, ob diese vollständige Zeichenfolge ist umgeben mit Klammern oder nicht.
bitte überprüfen Sie die Logik mit dem Beispiel jetzt...
Warum ein stack? Warum nicht einfach einen Zähler? Es ist nicht, wie Sie verwenden es für etwas anderes als das zählen.
InformationsquelleAutor
Tests
Methode
Sehr schnell
Wenn die erste öffnende Klammer hat das schließende Gegenstück, dann kann das Ergebnis doch nicht wahr sein. Gleiche Sache über die Letzte schließende Klammer.
Einschränkungen
Sollte nicht verwendet werden, wenn es gibt mehrere rekursive Klammern wie
((..)) + ((..))
Danke für deine Wertschätzung 🙂
Was ist mit strings wie
"((..)) + ((..))"
? Man kann nie wissen, der Letzte Teil ist wirklich der schließenden Klammer für die erste, ohne Blick auf den gesamten string.Richtig, in einem solchen Szenario, wenn es gibt mehrere rekursive Klammern, dieser Algorithmus schlägt fehl. Man sollte sich bewusst sein, dass es funktioniert nur für begrenzte Anwendungsfälle. Wenn das ausreicht, dann ist es schneller als das überprüfen der gesamten Zeichenfolge.
ja u r Recht... Botz3000 die Lösung perfekt funktioniert...
InformationsquelleAutor Ryszard Dżegan
Zu gewährleisten, gibt es Klammern können Sie einfach fügen Sie Sie:
Ansonsten die vorgeschlagenen Stapel von Botz3000:
InformationsquelleAutor MrFox
Können Sie die richtige Anzahl von parenthesises, indem Sie so etwas wie ein stack. Zählen Sie für jede Eröffnung und count-down für jede schließende Klammer. Die gleiche Anzahl von öffnenden und schließenden geschweiften Klammern bedeutet, dass es passt. Wenn Sie stoßen immer eine schließende geschweifte Klammer, während Ihre Anzahl gleich null ist, das ist ein Missverhältnis. Wenn Sie wissen möchten, ob Ihr string ist komplett umschlossen von paranthesises, prüfen Sie, ob alle von Ihnen passen, dann überprüfen Sie, wenn die Zeichenfolge beginnt mit einem.
())(
?Das sollte scheitern, weil, wenn man das ) nach (), das Niveau < 0 und throw new ApplicationException("die öffnende Klammer fehlt."); sollte das Feuer.
InformationsquelleAutor nvoigt