Следующий алгоритм - наихудший случай O(n * n)
, а средний случай - просто суперлинейный. Это наихудший случай, когда много длинных общих подстрок.
Рассмотрим набор подстрок, которые можно сформировать, начиная с произвольной точки в вашей строке. Создайте три из тех подстрок, которые заканчиваются указателем на местоположение в исходной строке, если есть только одно возможное совпадение. Вы должны поработать над этим триом для каждой из n подстрок, но вам нужно выполнить только самую длинную общую подстроку, которая есть в этой строке среди других.
Как только вы построите эту структуру данных, выполните рекурсивный обход дерева, ища пару подстроки с ее дополнением. Структура дерева должна сделать это соединение очень эффективным, так как вам нужно только соединить противоположные подстроки, а не подстроки со всеми другими местами в строке, которые могут быть.
Если некоторые символы встречаются часто, а их дополнения необычны, вы можете улучшить производительность, лениво создавая дерево.