def reducir_cadena(cadena):
"""Reduce una cadena de caracteres según las reglas del problema.
Args:
cadena: La cadena de caracteres a reducir.
Returns:
La longitud mínima de la cadena reducida.
"""
# Validación de longitud de cadena
if len(cadena) > 5 * 1000:
raise ValueError("La longitud de la cadena no debe exceder 5000 caracteres.")
pila = []
for c in cadena:
if c == '(':
pila.append(c) # Agregar '(' a la pila
elif c == ')':
# Si hay un '(' en la pila, lo eliminamos
if pila and pila[-1] == '(':
pila.pop() # Eliminamos el par de ()
else:
pila.append(c) # Agregamos ')' si no se puede eliminar
elif c == '?':
# Al encontrar un '?', tratamos de usarlo para balancear
if pila and (pila[-1] == '(' or pila[-1] == '?'):
# Usar '?' para eliminar '(' o para eliminar otro '?'
pila.pop() # Eliminar un '(' o un '?' balanceado
else:
# Usamos '?' como un '('
pila.append('(')
# Al final, la longitud de la pila representa los caracteres no eliminados.
return len(pila)
# Ejemplo de uso:
cadena = "??"
resultado = reducir_cadena(cadena)
print("Longitud mínima:", resultado) # Imprimirá: Longitud mínima: 0
cadena = "())?"
resultado = reducir_cadena(cadena)
print("Longitud mínima:", resultado) # Imprimirá: Longitud mínima: 2
# Prueba con una cadena larga (sin exceder el límite)
cadena_larga = "("*1000 + "?"*1000 + ")"*1000
resultado_largo = reducir_cadena(cadena_larga)
print("Longitud mínima para cadena larga:", resultado_largo) # Resultado variable según la cadena
# Prueba con una cadena que excede el límite
try:
cadena_excedida = "?" * 5001 # Más de 5000 caracteres
reducir_cadena(cadena_excedida)
except ValueError as e:
print(e) # Imprimirá: La longitud de la cadena no debe exceder 5000 caracteres.
# Complejidad algorítmica: O(n)