Dada una cadena , me gustaría encontrar la subsecuencia de repetición más larga (al menos dos veces). Es decir, me gustaría encontrar una cadena que sea una subsecuencia (no tiene que ser contigua) de tal que . Es decir, es una cadena cuyas mitades aparecen dos veces seguidas. Tenga en cuenta que es una subsecuencia de , pero no necesariamente una subcadena.
Ejemplos:
Para 'ababccabdc' será 'abcabc', porque 'abc' = 'abc' y 'abc' aparecen (al menos) dos veces en 'ababccabdc'.
Para 'addbacddabcd' una opción es 'dddd' porque 'dd' aparece dos veces (no puedo usar la misma letra varias veces, pero aquí tengo 4 'd's así que está bien), pero es de longitud 4. Puedo encontrar una mejor de longitud 8: 'abcdabcd', porque 'abcd' es una subcadena de 'addbacddabcd' que aparece dos veces.
Estoy interesado en encontrar la subsecuencia repetitiva más larga. Esto también se llama "encontrar el cuadrado más largo / más grande", pero he leído muchos artículos en los que se define un cuadrado para una subcadena y no para una subsecuencia.
Puedo usar fácilmente un algoritmo de fuerza bruta que tomará iterando en todas las opciones para un punto de interrupción en la cadena, y luego tendré dos cadenas en las que buscaré la subsecuencia común más grande / más larga, pero cada verificación tomará O ( n 2 ) utilizando una técnica de programación dinámica, por lo que todo el tiempo será O ( n 3 ) . Encontré un algoritmo más eficiente para la subsecuencia común más larga que toma , por lo que el tiempo de ejecución será .
Estoy buscando un algoritmo más eficiente para el problema de subsecuencia repetitiva más largo. Quizás mi idea de iterar sobre todos los puntos de interrupción desperdicia demasiado tiempo y puede reducirse a menos iteraciones. O quizás un algoritmo con una actitud diferente pueda resolver este problema.
He buscado en muchas revistas y preguntas anteriores, y la mayoría de los resultados que encontré fueron sobre una subcadena y no sobre una subsecuencia.
También he leído que esto se puede hacer usando árboles de sufijos, pero esto también era relevante para las subcadenas y no estoy seguro de si esa idea puede extenderse para la subsecuencia.
Estoy buscando una solución que se ejecute en el tiempo . Si existe uno en el tiempo eso será aún mejor (no estoy seguro de si existe).
$
Respuestas:
Aquí hay una solución de programación dinámica.
Suponga que la cadena de entrada es . Cree una tabla T cuyas filas y columnas estén indexadas por 0 , ... , n (donde n es la longitud de la cadena), poblada por la regla T [ i , j ] = { 0 si i = 0 o j = 0 , T [ i - 1 , j - 1 ] + 1 si x iX1... xnorte T 0 , ... , n norte
La respuesta esT[n,n].
fuente
if
dp[i][j] = dp[i - 1][j - 1] + 1