I denne vejledning lærer du at tjekke for gyldige parenteser i Python.
Med en række parenteser er det et populært kodende interviewspørgsmål at kontrollere, om kombinationen af parenteser er gyldig. Og i løbet af de næste par minutter vil du lære teknikken til at løse dette spørgsmål og også kode en Python-funktion for at validere en given streng.
Indholdsfortegnelse
Hvad er problemet med gyldige parenteser?
Lad os starte vores diskussion med at besvare spørgsmålet, hvad er problemet med gyldige parenteser?
Givet en streng, der indeholder tegnene simple parenteser, krøllede og firkantede klammeparenteser: () [] {}, skal du kontrollere, om den angivne parenteskombination er gyldig eller ej.
En gyldig parentesstreng opfylder følgende to betingelser:
Her er et par eksempler på gyldige og ugyldige parentesstrenge.
test_str = "{}]" --> INVALID, ] was never opened test_str = "[{}]" --> VALID test_str = "[]" --> VALID test_str = "[]{}" --> VALID test_str = "[{]}" --> INVALID, brackets closed incorrectly!
I vores problemløsningstilgang er stakken den datastruktur, der kommer til at spille en central rolle. Lad os gennemgå det grundlæggende i en stak i næste afsnit.
Stakdatastrukturen genbesøgt
Stakken er en last in first out (LIFO) datastruktur, hvor du kan tilføje elementer til toppen af stakken og også fjerne dem fra toppen af stakken.
Når du tilføjer et element til staktoppen, udfører du en push-operation, når du fjerner et element fra stack-toppen, udfører du en pop-operation.
Vi bruger de følgende to regler til at komme med et sæt operationer, som vi kan udføre på parentesstrengen.
- Skub alle åbningsbeslag på stakken.
- Hvis du støder på et lukkebeslag, skal du tage stabletoppen af.
Lad os fortsætte med at løse det gyldige parenteskontrolproblem.
Sådan tjekker du for gyldige parenteser
Ved at sammensætte alle observationerne fra ovenstående eksempler har vi følgende.
Tjek længden af parentesstrengen: Hvis ulige, er strengen ugyldig
Da hver åbningsparentes skal have en afsluttende parentes, bør en gyldig streng indeholde et lige antal tegn. Hvis længden af strengen er ulige, kan du konkludere med det samme, at den har en ugyldig kombination af parenteser.
# len(test_str) = 3 (odd); ] does not have an opening [ test_str = "{}]" # len(test_str) = 3 (odd); ( does not have a closing ) test_str = "[(]" # len(test_str) = 5 (odd); there's a spurious ) test_str = "{())}"
Lad os derefter se, hvordan vi kan tackle, når antallet af tegn i strengen er lige
Længden af parentesstrengen er lige: hvad nu?
Trin 1: Kør strengen fra venstre mod højre. Lad os kalde strengen test_str, og de individuelle tegn i strengen char.
Trin 2: Hvis det første tegn tegn er en åbningsparentes (, { eller [, push it to the top of the stack and proceed to the next character in the string.
Step 3: Now, check if the next character (char) is an opening or a closing bracket.
Step 3.1: If it’s an opening bracket, push it again onto the stack.
Step 3.2: If you encounter a closing bracket instead, pop off the stack top, and proceed to step 4.
Step 4: Here again, there are 3 possibilities based on the value popped off the stack:
Step 4.1: If is an opening bracket of the same type, loop back to step 3.
Step 4.2: If it is an opening bracket of a different type, you can again conclude that it is not a valid parentheses string.
Step 4.3: The final possibility is that the stack is empty. Again, this is the case of an invalid string, as you’ve run into a closing bracket that doesn’t have a matching opening bracket.
Valid Parentheses String Examples Walkthrough
Now let’s take three examples and walk through the above steps.
📑 If you’ve already gotten the hang of how this works, feel free to skip to the next section.
#1. As a first example, let test_str = “{()”.
- { is the first character, and it’s an opening bracket, so you push it to the stack.
- The next character ( is also an opening bracket, so go ahead and push it onto the stack as well.
- The third character in the string ) is a closing bracket, so you have to pop off the stack top, which returns (.
- At this point, you’ve reached the end of the string. But the stack still contains the opening { , which was never closed. So the given parentheses string test_str is invalid.
#2. In this second example, let test_str = “()]”
- Det første tegn ( er en åbningsparentes; skub den til stakken.
- Det andet tegn ) er en afsluttende parentes; pop stabeltoppen af, som tilfældigvis er ) – en åbningsbeslag af samme type. Fortsæt til næste tegn.
- Det tredje tegn ]er en afsluttende firkantet parentes, og du bør springe af stabeltoppen igen. Men som du kan se, er stakken tom – hvilket betyder, at der ikke er nogen matchende åbningsbeslag [. Hence, this string is invalid.
#3. In this final example, test_str = “{()}”.
- The first two characters {( are opening brackets, so push them onto the stack.
- The third character is a closing ), so pop off the stack top – (.
- The next character } is a closing curly brace, and when you pop the stack top, you get { – an opening curly brace.
- After you have traversed the entire string, the stack is empty and test_str is valid! ✅
📌 I’ve put together the following flowchart outlining the steps in the valid parentheses checking problem. You may save it for quick reference!
In the next section, let’s see how to translate our concept to Python code.
Python Program to Check for Valid Parentheses
In Python, you can use the list to emulate a stack.
You can use the .append() method to add elements to the end of the list. This is similar to pushing to the top of the stack.
The .pop() method returns the last element from the list, and this is similar to the popping off the top of the stack – to remove the last-added element.
So you now know how to implement the push and pop operations on a Python list, emulating the stack.
As a next step, let’s answer the question: how to differentiate between opening and closing brackets?
Well, you can use a Python dictionary – with the opening brackets ‘{‘, ‘[‘, ‘(‘ as the keys of the dictionary and the corresponding closing brackets ‘}’, ‘]’, ‘)’ som værdierne. Du kan bruge metoden .keys() til at få adgang til individuelle nøgler i ordbogen.
Lad os bruge alt det, vi har lært, til at skrive definitionen af funktionen is_valid().
Forstå funktionsdefinitionen
Læs den følgende kodecelle, der indeholder funktionsdefinitionen. Du kan se, at vi har brugt trinene i flowchartet sammen med ovenstående forklaring.
Derudover har vi også tilføjet en docstring inklusive:
- en kort beskrivelse af funktionen
- argumenterne i funktionskaldet
- returværdierne fra funktionen
▶ Du kan bruge help(is_valid) eller is_valid.__doc__ til at hente docstringen.
def isValid(test_str): '''Check if a given parentheses string is valid. Args: test_str (str): The parentheses string to be validated Returns: True if test_str is valid; else False ''' # len(test_str) is odd -> invalid! if len(test_str)%2 != 0: return False # initialize parentheses dict par_dict = {'(':')','{':'}','[':']'} stack = [] for char in test_str: # push opening bracket to stack if char in par_dict.keys(): stack.append(char) else: # closing bracket without matching opening bracket if stack == []: return False # if closing bracket -> pop stack top open_brac = stack.pop() # not matching bracket -> invalid! if char != par_dict[open_brac]: return False return stack == []
Python-funktionen is_valid kontrollerer, om parentesstrengen er gyldig, og den fungerer som følger.
- Funktionen is_valid tager én parameter, test_str, som er parentesstrengen, der skal valideres. Det returnerer True eller False afhængigt af om strengen test_str er gyldig eller ej.
- Her er stak Python-listen, der emulerer stakken.
- Og par_dict er Python-ordbogen, med åbne parenteser som tasterne og afsluttende parenteser som de tilsvarende værdier.
- Mens vi krydser strengen, hvis vi støder ind i en tilstand, der gør parentesstrengen ugyldig, returnerer funktionen False og afsluttes.
- Efter at have krydset alle tegnene i strengen, stak == [] tjekker om stakken er tom. Hvis ja, er test_str gyldig, og funktionen returnerer True. Ellers returnerer funktionen Falsk.
Lad os nu gå videre og foretage et par funktionskald for at bekræfte, at vores funktion fungerer korrekt.
str1 = '{}[]' isValid(str1) # Output: True str2 = '{((}' isValid(str2) # Output: False str3 = '[{()}]' isValid(str3) # Output: True str4 = '[{)}]' isValid(str4) # Output: False str5 = '[[]}' isValid(str5) # Output: False
Ud fra kodestykket ovenfor kan vi konkludere, at funktionen fungerer som forventet!
Konklusion 🧑💻
Her er en hurtig oversigt over, hvad du har lært.
- For det første blev du introduceret til problemet med kontrol af gyldige parenteser.
- Dernæst lærte du en tilgang til at løse problemet ved at bruge stakken som den valgte datastruktur.
- Du lærte derefter, hvordan du validerer en parenteskombination ved hjælp af en Python-ordbog: med åbne parenteser, tasterne og de tilsvarende afsluttende parenteser som værdier.
- Til sidst definerede du Python-funktionen for at kontrollere, om en given parentesstreng er gyldig.
Som et næste trin kan du prøve at kode problemet på toadmin.dk’s online Python-editor. Du er velkommen til at gense denne guide, hvis du har brug for hjælp!
Se flere Python-tutorials. God kodning!🎉