2010-04-04 17 views
12

Para una cuerda de longitud L , quiero encontrar la subcadena más larga que aparece n (n < L) o más veces en THS cadena.subcadena más larga que aparece n veces

Por ejemplo, la subcadena más larga que aparece 2 o más veces en "BANANA" es "ANA", una vez que comienza en el índice 1 y una vez más comienza en el índice 3. Las subcadenas pueden superponerse.

En la cadena "FFFFFF", la cadena más larga que aparece 3 o más veces es "FFFF".

El algoritmo de fuerza bruta para n = 2 seleccionará todos los pares de índices en la cadena, y luego continuará hasta que los caracteres sean diferentes. La parte ejecutable toma O (L) y el número de pares es O (L^2) (los duplicados no están permitidos pero ignoro eso) por lo que la complejidad de este algoritmo para n = 2 sería O (L^3). Para valores mayores de n, esto crece exponencialmente.

¿Hay un algoritmo más eficaz para este problema?

Respuesta

13

Los sufijos resuelven este tipo de problemas muy rápido, generalmente O (n) tiempo y espacio.

mirada a la página wiki:

Suffix Trees.

y leer el material (la sección Funcionalidad) en esa página que enlaza con:

Longest Repeated Substring.

+2

excelente respuesta (en contra de su nombre de usuario)! –

Cuestiones relacionadas