Inhalt
Die Fakten:
Plattform: | codewars.com |
Name: | Valid Parentheses |
Level: | 7 kyu |
Sprache: | TypeScript |
Beschreibung:
Write a function that takes a string of parentheses, and determines if the order of the parentheses is valid. The function should return true
if the string is valid, and false
if it's invalid.
Examples
"()" => true
")(()))" => false
"(" => false
"(())((()())())" => true
Constraints
0 <= length of input <= 100
- All inputs will be strings, consisting only of characters
(
and)
. - Empty strings are considered balanced (and therefore valid), and will be tested.
- For languages with mutable strings, the inputs should not be mutated.
Protip: If you are trying to figure out why a string of parentheses is invalid, paste the parentheses into the code editor, and let the code highlighting show you!
Quelle: codewars.com
Lösung
Pseudo-Code
Wie immer gibt's reichlich Varianten, hier ist eine meiner.
Erst die Lösungsschritte in Pseudo-Code. Los geht’s:
Lösungsschritte
Schritt 1
Wir loopen durch den Input-String.
Schritt 2
Für jede öffnende Klammer erhöhen wir einen Counter um 1
.
Schritt 3
Für jede schließende Klammer ziehen wir 1
vom Counter ab.
Schritt 4
Optional: Sollte zu irgendeinem Zeitpunkt der Counter negativ werden, können wir den Loop vorzeitig abbrechen und false
zurückgeben.
Schritt 5
Ansonsten geben wir nach dem Loop zurück, ob der Counter 0
ist.
Code
Geil. Übersetzen wir unseren Pseudo-Code in TypeScript:
Lösungsschritte
Meine erste Zeile:
export function validParentheses(str: string): boolean {
Counter initialisieren:
let numOpenParentheses = 0;
Loop durch den Input-String:
for (const char of str) {
Wenn das aktuelle Zeichen eine öffnende Klammer ist, addieren wir 1
zum Counter:
if (char === "(") numOpenParentheses++;
Wenn das aktuelle Zeichen eine schließende Klammer ist, ziehen wir 1
vom Counter ab:
if (char === ")") numOpenParentheses--;
Optional: Sollte der Counter irgendwann kleiner 0
werden (also mehr schließende als öffnende Klammern), können wir die Funktion vorzeitig beenden:
if (numOpenParentheses < 0) return false;
}
Nach dem Loop geben wir aus, ob der Counter 0
ist, also alle öffnenden Klammern geschlossen wurden:
return numOpenParentheses === 0;
}
Voilá! 💪
Komplettlösung
export function validParentheses(str: string): boolean {
let numOpenParentheses = 0;
for (let char of str) {
if (char === "(") numOpenParentheses++;
if (char === ")") numOpenParentheses--;
if (numOpenParentheses < 0) return false;
}
return numOpenParentheses === 0;
}