Алгоритм поиска наиболее распространенных подстрок в строке

Есть ли какой-нибудь алгоритм, который можно использовать для поиска наиболее распространенных фраз (или подстрок) в строке? Например, следующая строка будет иметь «привет мир» в качестве наиболее распространенной фразы из двух слов:

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

В приведенной выше строке наиболее распространенной строкой (после символа пустой строки, который повторяется бесконечное число раз) будет символ пробела.

Есть ли способ генерировать список общих подстрок в этой строке, от наиболее распространенных до наименее распространенных?