Utilizamos la matriz longest common prefix (LCP) array y el sufijo para resolver este problema en O (log n n) tiempo
La matriz LCP nos da el prefijo común más largo entre dos sufijos consecutivos en la matriz de sufijos.
Después de construir la matriz LCP y la matriz de sufijos, podemos buscar binariamente la longitud de la respuesta.
Supongamos que la cadena es "acaca $". La matriz de sufijos se da en el fragmento de código como una tabla.
<table border="1">
<tr><th>Suffix Array index</th><th>LCP</th><th>Suffix (implicit)</th></tr>
<tr><td>5</td><td>-1</td><td>$</td></tr>
<tr><td>4</td><td>0</td><td>a$</td></tr>
<tr><td>2</td><td>1</td><td>aca$</td></tr>
<tr><td>0</td><td>3</td><td>acaca$</td></tr>
<tr><td>3</td><td>0</td><td>ca$</td></tr>
<tr><td>1</td><td>2</td><td>caca$</td></tr>
</table>
búsqueda binaria
Vamos por la duración de la respuesta.
Si tenemos una respuesta determinada, dejemos que las dos subcadenas correspondan a dos sufijos.
No hay garantía de que estos sufijos sean consecutivos en la matriz de sufijos. Sin embargo, si conocemos la longitud de la subcadena, podemos ver que cada entrada en la tabla LCP entre los dos sufijos de las subcadenas es al menos ese número. Además, la diferencia entre los índices de los dos bastantes debe ser al menos ese número.
Suponiendo que la longitud de la subcadena es una cierta cantidad, podemos considerar ejecuciones consecutivas de entradas de matriz LCP que son al menos esa cantidad. En cada ejecución consecutiva, encuentre el sufijo con el índice más grande y el más pequeño.
¿Cómo sabemos que nuestra conjetura es un límite inferior?
Si la distancia entre el índice más grande y el más pequeño en algunas [ejecuciones consecutivas de las entradas de la matriz LCP que son al menos nuestra suposición] es al menos nuestra suposición, entonces, nuestra conjetura es un límite inferior alcanzable.
¿Cómo sabemos que nuestra suposición es demasiado grande?
Si la distancia entre el índice más grande y el más pequeño en todas [las ejecuciones consecutivas de las entradas de la matriz LCP que son al menos nuestra suposición] es menor que nuestra conjetura, entonces, nuestra suposición es demasiado grande.
¿Cómo encontramos la respuesta dada la duración de la respuesta?
Para cada [carreras consecutivas de entradas de matriz LCP que son al menos la respuesta], encuentre los índices más bajo y más alto. Si difieren por lo menos en la respuesta, entonces volvemos que las subcadenas repetidas no superpuestas más largas comienzan en estos índices.
En su ejemplo, "acaca $", podemos encontrar que la duración de la respuesta es 2.
Todas las pistas son: "aca $", "acaca $", y la distancia entre el los índices más bajos y más altos son 2, lo que da como resultado la subcadena repetida "ac".
"caca $", "ca $", y la distancia entre los índices inferior y superior es 2, lo que da como resultado la subcadena repetida "ca".
¿Debe repetirse de inmediato? ¿Qué pasa si tienes abcdabcbc? ¿Sería eso BB? ¿O sería abc? – Perkins
No estoy seguro de lo que quiere decir con inmediato. La cadena de respuesta no debe solaparse con al menos otra repetición. En su ejemplo, sería abc ya que hay más de un "abc" que no se superpone. –