LeetCode: Eliminarea stelelor dintr-un șir & Simplificarea căii

  • 1 minute de citit
  • 3 exemple de cod în Python

Disponibil și în English

Pe această pagină

Salut 👋,

Am început să fac câteva probleme zilnice de LeetCode împreună cu Paula și aș vrea să vă împărtășesc soluțiile noastre pentru ultimele două probleme.

https://leetcode.com/problems/removing-stars-from-a-string/

https://leetcode.com/problems/simplify-path/

Vreau să urez și un călduros bun venit noilor abonați de pe nuculabs.dev! Mulțumesc că v-ați abonat!

Dacă vrei să încerci problemele singur, oprește-te din citit, altfel vei fi spoiler-uit de soluții.

Eliminarea stelelor dintr-un șir

În această problemă primești un șir cu stele ‘*’ și, când întâlnești o stea, trebuie să elimini steaua împreună cu caracterul din stânga ei.

Enunțul complet al problemei poate fi găsit aici: removing-stars-from-a-string.

Soluția folosește o stivă simplă:


class Solution:    def removeStars(self, s: str) -> str:        list_s = []        for i, char in enumerate(s):            if char == "*":                list_s.pop()            else:                list_s.append(char)        return "".join(list_s)

Simplificarea căii

În această problemă primești o cale unix și trebuie să o simplifici, de exemplu calea “/a//b////c/d//././/..” va fi simplificată la “/a/b/c”.

Soluția folosește o stivă simplă:

class Solution:    def remove_duplicated_slashes(self, path: str):        clean_path = []        last_char = None        for s in path:            if s == "/" and last_char == "/":                continue            clean_path.append(s)            last_char = s        return "".join(clean_path)    def simplifyPath(self, path: str) -> str:        # elimină slash-urile duplicate        simplified_path = []        clean_path = self.remove_duplicated_slashes(path)        parts = clean_path.split("/")        for part in parts:            if part == "." or part == "":                continue            elif part == "..":                if len(simplified_path) > 0:                    simplified_path.pop()            else:                simplified_path.append(part)        return "/" + "/".join(simplified_path)

Soluția Paulei este mai simplă și mai curată, după părerea mea:

class Solution:    def simplifyPath(self, path: str) -> str:        dirs = path.split('/')        dirs = [dir for dir in dirs if len(dir) > 0]        stack = []        for dir in dirs:            if dir == '.':                continue            else:                if dir != '..':                    stack.append(dir)                else:                    if len(stack) == 0:                        stack.append('/')                    stack.pop()        # print(stack[::-1])        return '/'+"/".join(stack)

Mulțumesc pentru lectură! 🍻