La supercadena oculta (bonus)
📖Historia
La supercadena oculta
Un mensaje fue dividido en múltiples fragmentos que se solapan parcialmente y se mezclaron sin orden.
Solo una reconstrucción consistente revela el contenido completo.
"El orden emerge cuando maximizas lo compartido y minimizas lo redundante."
Tu misión es reconstruir la cadena más corta posible que contenga todos los fragmentos como subcadenas.
🎯Enunciado
Dado un array de strings fragments, reconstruye una supercadena que contenga a cada fragmento como subcadena.
Reglas y requerimientos:
- El resultado debe incluir cada fragmento al menos una vez.
- Minimiza la longitud total (aproximación aceptada; el problema exacto es NP-difícil).
- Estrategia greedy: en cada paso fusiona el par con mayor solapamiento (prefijo/sufijo). Empates:
a) elige la fusión que produzca la cadena resultante más corta
b) si persiste el empate, usa orden lexicográfico del par `[i,j]` - Preprocesamiento obligatorio:
— elimina vacíos
— elimina fragmentos totalmente contenidos en otros
— considera solapamientos en ambas direcciones (A⊕B y B⊕A) - Complejidad práctica: n ≤ 50, |s| ≤ 200.
- Si `fragments` está vacío, devuelve `''`.
Devuelve una de las supercadenas mínimas según la heurística.
Ejemplos:
— Ejemplo 1: Solapamiento simple
fragments = ['ab', 'bc', 'c']
Pasos:
• overlap('ab','bc') = 1 ⇒ merge → 'abc'
• 'abc' ya contiene 'c'
Resultado: 'abc'
— Ejemplo 2: Contención total
fragments = ['abcd', 'bc', 'cd']
'bc' y 'cd' están contenidos en 'abcd' ⇒ se eliminan
Resultado: 'abcd'
— Ejemplo 3: Solapamiento en ambas direcciones
fragments = ['abc', 'bcd', 'cde']
• mejor par: ('abc','bcd') con overlap=2 ⇒ 'abcd'
• fusiona con 'cde' (overlap=2) ⇒ 'abcde'
Resultado: 'abcde'
— Ejemplo 4: Empate por solapamiento, decide por cadena más corta
fragments = ['abaa', 'baab']
• overlap('abaa','baab') = 3 ⇒ 'abaab'
• overlap('baab','abaa') = 3 ⇒ 'baaba'
Ambas con mismo solapamiento; la más corta es 'abaab'
Resultado: 'abaab'
— Ejemplo 5: Redundancia elevada
fragments = ['aaaa', 'aaa', 'aa']
La limpieza elimina 'aaa' y 'aa' (contenidos en 'aaaa')
Resultado: 'aaaa'
— Ejemplo 6: Caso clásico tipo ensamblaje
fragments = ['GCTA', 'CTAAGT', 'TTCA', 'ATGCATC']
La heurística greedy produce una supercadena válida que contiene todos los fragmentos, p. ej.:
Resultado posible: 'GCTAAGTTTCATGCATC' // cualquier supercadena corta que contenga todas es válida
— Ejemplo 7: Entrada vacía
fragments = []
Resultado: ''
✅Casos de prueba
Tu solución será validada contra 5 casos de prueba
... y 2 casos más