Dada una cadena, ¿cuál es su subcadena más corta, la concatenación de una o más copias de sus resultados en la cadena original?

La clave aquí es que podemos iterar las búsquedas a la función de falla. Deje S ser una cadena. Busque la función de falla para que S obtenga el prefijo apropiado más largo S ‘de S, que también es un sufijo. Luego, si busca la función de falla para que S ‘obtenga su prefijo más largo S’ ‘, que también es su sufijo, entonces S’ ‘es el segundo prefijo más largo de la cadena S original que también es un sufijo de S. Y si busca la función de falla para S ”, obtendrá el tercer prefijo apropiado más largo de la cadena original que también es uno de sus sufijos. Y así.

En su ejemplo, la función de falla para toda la cadena es 4, lo que denota que ABAB es el prefijo más largo que también es un sufijo. La cadena de aumento es ABABC, pero su longitud de 5 no divide 9, por lo que no puede ser la subcadena deseada. Entonces, debe continuar buscando la función de falla para ABAB, que le da el siguiente prefijo más largo que también es un sufijo, que es AB. En este caso, la cadena de aumento sería ABABCAB. Nuevamente, 7 no divide a 9, por lo que AB tampoco puede ser la respuesta. Finalmente, buscamos la función de falla de AB, que es 0. Una vez que llegamos a 0, sabemos que la cadena de aumento tiene que ser la cadena completa.

Vamos a construir el algoritmo de intuición.

Primero, debemos tener claro qué contiene la tabla de fallas,
Dada una cadena S y un prefijo P de S con longitud i,
F [i] es el prefijo más largo de P, que también es un sufijo de P.

Vamos a definir una gramática para generadores,
G = g | GG | GGG

Dada una cadena S, S puede dividirse en 3 cadenas iguales,
O 2 cuerdas iguales, O S es un generador.

¿Cómo conectamos esto con la función de falla?
Por la definición de F [i] = l

  1. Si la cadena S tiene longitud n y n> 2 * l
    Lo que significa que S = GYG, podemos demostrar que no importa cuál sea el valor de Y, S no puede ser generado por ninguna subcadena de S.
  2. Si n = 2 * l entonces S = GG, podemos calcular el generador de G recursivamente.
  3. Si n <2 * l, entonces podemos reescribir S como XYZ y podemos mostrar que X = Y = Z
    Entonces podemos reescribir S = GGG y calcular el generador de G recursivamente.

Consideremos el caso de ” ABABCABAB
F = [0 0 0 1 2 0 1 2 3 4]
Tenemos F [9] = 4, que cae bajo la primera condición 9> 2 * 4
Entonces los algoritmos fallan y el generador mínimo para la cadena es él mismo.