fork download
  1. def reducir_cadena(cadena):
  2. """Reduce una cadena de caracteres según las reglas del problema.
  3.  
  4. Args:
  5. cadena: La cadena de caracteres a reducir.
  6.  
  7. Returns:
  8. La longitud mínima de la cadena reducida.
  9. """
  10. # Validación de longitud de cadena
  11. if len(cadena) > 5 * 1000:
  12. raise ValueError("La longitud de la cadena no debe exceder 5000 caracteres.")
  13.  
  14. pila = []
  15.  
  16. for c in cadena:
  17. if c == '(':
  18. pila.append(c) # Agregar '(' a la pila
  19. elif c == ')':
  20. # Si hay un '(' en la pila, lo eliminamos
  21. if pila and pila[-1] == '(':
  22. pila.pop() # Eliminamos el par de ()
  23. else:
  24. pila.append(c) # Agregamos ')' si no se puede eliminar
  25. elif c == '?':
  26. # Al encontrar un '?', tratamos de usarlo para balancear
  27. if pila and (pila[-1] == '(' or pila[-1] == '?'):
  28. # Usar '?' para eliminar '(' o para eliminar otro '?'
  29. pila.pop() # Eliminar un '(' o un '?' balanceado
  30. else:
  31. # Usamos '?' como un '('
  32. pila.append('(')
  33.  
  34. # Al final, la longitud de la pila representa los caracteres no eliminados.
  35. # Cada ')' en la pila no puede ser emparejado y debe ser contado.
  36. return len(pila)
  37.  
  38. # Ejemplo de uso:
  39. cadena = "??()("
  40. resultado = reducir_cadena(cadena)
  41. print("Longitud mínima:", resultado) # Imprimirá: Longitud mínima: 1
  42.  
  43. # Otros ejemplos:
  44. print("Longitud mínima:", reducir_cadena("(?)))")) # Ejemplo problemático
  45. print("Longitud mínima:", reducir_cadena("(())??")) # Debería ser 0
  46. print("Longitud mínima:", reducir_cadena("??(())")) # Debería ser 0
  47.  
Success #stdin #stdout 0.01s 7128KB
stdin
Standard input is empty
stdout
('Longitud m\xc3\xadnima:', 1)
('Longitud m\xc3\xadnima:', 3)
('Longitud m\xc3\xadnima:', 0)
('Longitud m\xc3\xadnima:', 0)