La supercadena oculta (bonus)

Difícil
cadenas
greedy-avanzado
NP-dificil
superstring

📖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:

  1. El resultado debe incluir cada fragmento al menos una vez.
  2. Minimiza la longitud total (aproximación aceptada; el problema exacto es NP-difícil).
  3. 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]`
  4. Preprocesamiento obligatorio: — elimina vacíos
    — elimina fragmentos totalmente contenidos en otros
    — considera solapamientos en ambas direcciones (A⊕B y B⊕A)
  5. Complejidad práctica: n ≤ 50, |s| ≤ 200.
  6. 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

Test 1: Inicio del mensaje
Test 2: Segunda palabra del mensaje
Test 3: Parte intermedia del mensaje

... y 2 casos más

💻 Editor de código

JavaScript
Cargando editor...
Loading...