LeetCode 678 — Valid Parenthesis String

Octavo y último problema de Greedy. Como 20-valid-parentheses pero con wildcards '*' (puede ser (, ) o vacío). Greedy: trackear rango de posibles open counts.

Enunciado

s con '(', ')' y '*'. Devuelve True si puede ser válido.


Solución — Track range [low, high] de open count

class Solution:
    def checkValidString(self, s):
        low = high = 0                           # rango de open count posible
        for c in s:
            if c == '(':
                low += 1; high += 1
            elif c == ')':
                low -= 1; high -= 1
            else:                                 # '*'
                low -= 1                          # treat as ')'
                high += 1                         # treat as '('
            if high < 0: return False             # demasiados ')'
            low = max(low, 0)                     # no permitir negativos
        return low == 0

Análisis: O(n) tiempo, O(1) espacio.

El truco “rango”

Como * puede ser cualquiera, mantenemos el rango [low, high] de “open counts” posibles tras cada char. Si high < 0 → ni el mejor caso lo salva. Si al final low == 0 es alcanzable → válido.


Cierre Greedy

#ProblemaIdea distintiva
153-maximum-subarrayKadane
255-jump-gameMax reach
345-jump-game-iiBFS por niveles implícito
4134-gas-stationReiniciar desde i+1
5846-hand-of-straightsGreedy desde menor + Counter
61899-merge-triplets-to-form-target-tripletFiltrar triplets válidos
7763-partition-labelsLast occurrence de cada char
8EsteTrack [low, high] con wildcards

Conexiones

Estado

  • Leído
  • Implementado desde cero
  • Resuelto en LeetCode
  • Patrón Greedy cerrado [OK]