Для строки длины L, я хочу найти самую длинную подстроку, которая появляется n (n <L) или больше раз в тыс строки.
Например, самой длинной подстрокой, которая происходит 2 или больше раза в "БАНАНЕ", является "ANA", однажды начинающий с индекса 1 и еще раз начинающий с индекса 3. Подстрокам позволяют наложиться.
В строке "FFFFFF" самая длинная строка, которая появляется 3 или больше раза, является "FFFF".
Алгоритм грубой силы для n=2 выбрал бы всех пар индексов в строке, затем работая вперед, пока символы не отличаются. Выполнение - вдоль части берет O (L), и количество пар является O (L^2) (дубликаты не позволяются, но я игнорирую, что), таким образом, сложность этого алгоритма для n=2 была бы O (L^3). Для больших значений n это растет экспоненциально.
Существует ли более эффективный алгоритм для этой проблемы?
Суффикс-деревья решают подобные проблемы очень быстро, обычно за O (n) времени и пространства.
Посмотрите на вики-страницу:
и прочтите материал (раздел Функциональные возможности) на этой странице, который ссылается на: