Algoritmo para encontrar las subcadenas más comunes en una cadena

¿Hay algún algoritmo que pueda usarse para encontrar las frases (o subcadenas) más comunes en una cadena? Por ejemplo, la siguiente cadena tendría "hola mundo" como su frase de dos palabras más común:

"hello world this is hello world. hello world repeats three times in this string!"

En la cadena anterior, la cadena más común (después del carácter de cadena vacía, que se repite un número infinito de veces) sería el carácter de espacio.

¿Hay alguna forma de generar una lista de subcadenas comunes en esta cadena, de la más común a la menos común?

Respuestas a la pregunta(5)

Su respuesta a la pregunta