O problema é surpreendentemente não trivial. Primeiro, dois algoritmos de força bruta. Um quadrado ("padrão repetido") é dado por seu comprimento e posição , e leva tempo para verificar. Se passar por cima de tudo e p , obtemos um O ( n 3 ) algoritmo. Podemos melhorar isso primeiro dando um loop sobre ℓ e depois varrendo a string com dois ponteiros em execução a uma distância deℓpO(ℓ)ℓpO(n3)ℓℓ . Dessa forma, é possível verificar seexisteum quadrado de comprimento2ℓ em tempo linear, resultando em um tempo total de execução deO(n2) .
Kolpakov e Kucherov desenvolveram um algoritmo para encontrar todas as repetições máximas em uma palavra no tempo O(n) [1], e seu algoritmo pode ser usado para encontrar todos os quadrados máximos no tempo O(n) . Uma repetição é um subpalavra da forma wkx , onde k ≥ 2 e x é um prefixo adequado de W . O maior quadrado contido nessa repetição é ( w⌊ k / 2 ⌋)2. Usando esta fórmula, dadas todas as repetições máximas em uma palavra (das quais existem apenas O ( n ) muitas)), pode-se encontrar o quadrado maior.
[1] Kolpakov, R. & Kucherov, G. (1999). Encontrando repetições máximas em uma palavra em tempo linear . In Foundations of Computer Science, 1999. 40º Simpósio Anual sobre (pp. 596-604). IEEE.
142857
não é o mais longo, porque142857142857
é mais longo. Eu acho que você deve editar a pergunta para esclarecer o que você quer dizer com "padrão repetido".