El problema es sorprendentemente no trivial. Primero, dos algoritmos de fuerza bruta. Un cuadrado ("patrón repetido") viene dado por su longitud y posición , y toma tiempo para verificar. Si nos vamos sobre toda y , se obtiene un algoritmo. Podemos mejorar eso primero haciendo un bucle sobre y luego escaneando la cadena con dos punteros en ejecución a una distancia de . De esta manera, se puede verificar si existe un cuadrado de longitud en tiempo lineal, dando un tiempo total de ejecución de .ℓpO(ℓ)ℓpO(n3)ℓℓ2ℓO(n2)
Kolpakov y Kucherov desarrollaron un algoritmo para encontrar todas las repeticiones máximas en una palabra en el tiempo [1], y su algoritmo se puede usar para encontrar todos los cuadrados máximos en el tiempo . Una repetición es una palabra parcial de la forma , donde y es un prefijo apropiado de . El cuadrado más grande contenido en esa repetición es . Usando esta fórmula, dadas todas las repeticiones máximas en una palabra (de las cuales solo hay muchas), se puede encontrar el cuadrado más grande.O(n)O(n)wkxk≥2xw(w⌊k/2⌋)2O(n)
[1] Kolpakov, R. y Kucherov, G. (1999). Encontrar repeticiones máximas en una palabra en tiempo lineal . En Fundamentos de Ciencias de la Computación, 1999. 40º Simposio Anual sobre (pp. 596-604). IEEE
142857
no es el más largo porque142857142857
es más largo. Creo que debería editar la pregunta para aclarar lo que quiere decir con "patrón repetido".