Учитывая строку , я хотел бы найти самую длинную повторяющуюся (по крайней мере дважды) подпоследовательность. То есть я хотел бы найти строку которая является подпоследовательностью (не обязательно должна быть смежной) такой что . То есть - это строка, половинки которой появляются дважды подряд. Обратите внимание, что является подпоследовательностью , но не обязательно подстрокой.
Примеры:
Для «ababccabdc» это будет «abcabc», потому что «abc» = «abc» и «abc» появляются (как минимум) дважды в «ababccabdc».
Для 'addbacddabcd' одним из вариантов является 'dddd', потому что 'dd' появляется дважды (я не могу использовать одну и ту же букву несколько раз, но здесь у меня 4 'd, так что все в порядке), но его длина 4. Я могу найти лучший длины 8: «abcdabcd», потому что «abcd» является подстрокой «addbacddabcd», которая появляется дважды.
Я заинтересован в поиске самой длинной повторяющейся подпоследовательности. Это также называется «найти самый длинный / самый большой квадрат», но я читал много статей, в которых квадрат определен для подстроки, а не для подпоследовательности.
Я могу легко использовать алгоритм грубой силы, который примет , итерируя по всем параметрам для точки останова в строке, и тогда у меня будет две строки, в которых я буду искать самую большую / самую длинную общую подпоследовательность, но каждая проверка будет принимать с использованием техники динамического программирования, поэтому все время будет . Я нашел более эффективный алгоритм для самой длинной общей подпоследовательности, который принимает , поэтому время выполнения будет .
Я ищу более эффективный алгоритм для самой длинной повторяющейся проблемы подпоследовательности. Возможно, моя идея итерации по всем точкам останова тратит слишком много времени и может быть уменьшена до меньшего количества итераций. Или, возможно, алгоритм с другим отношением может решить эту проблему.
Я искал во многих журналах и предыдущих вопросах, и большинство результатов, которые я нашел, было о подстроке, а не о подпоследовательности.
Я также читал, что это можно сделать с помощью суффиксных деревьев, но это также относилось к подстрокам, и я не уверен, что такая идея может быть расширена для подпоследовательности.
Я ищу решение, которое выполняется за время . Если существует одно время , это будет еще лучше (я не уверен, что таковое существует).O ( n ⋅ log n )
$
, решая проблему LCS.