З огляду на рядок , я хотів би знайти найдовший підряд (щонайменше двічі) підряд. Тобто, я хотів би знайти рядок який є подальшим (не повинно бути суміжним) з таким, що . Тобто, - рядок, половинки якої з’являються двічі поспіль. Зауважимо, що - це підряд , але не обов'язково підрядка.
Приклади:
Для 'ababccabdc' це буде 'abcabc', тому що 'abc' = 'abc' і 'abc' з’являється (принаймні) двічі в 'ababccabdc'.
Для 'addbacddabcd' одним із варіантів є 'dddd', тому що 'dd' з’являється двічі (я не можу використовувати одну і ту ж букву кілька разів, але тут у мене 4 'd, так це нормально), але її довжина 4. Я можу знайти кращу довжини 8: 'abcdabcd', оскільки 'abcd' є підрядком 'addbacddabcd', що з’являється двічі.
Мені цікаво знайти найдовшу послідовність, що повторюється. Це також називається "пошук найдовшого / найбільшого квадрата", але я прочитав багато статей, у яких квадрат визначений для підрядка, а не для підпорядкування.
Я легко можу використовувати алгоритм грубої сили, який буде приймати шляхом повторення всіх варіантів точки розриву в рядку, і тоді у мене будуть два рядки, в яких я буду шукати найбільшу / найдовшу спільну послідовність, але кожна перевірка буде приймати використанням динамічної методики програмування, тому весь час буде . Я знайшов більш ефективний алгоритм для найдовшого загального підпорядкування, який займає , тому час роботи буде .
Я шукаю більш ефективний алгоритм для найбільш тривалої повторюваної задачі про підряд. Можливо, моя думка про повторення над усіма точками пробивання занадто багато часу, і її можна звести до меншої кількості ітерацій. Або, можливо, алгоритм з іншим ставленням може вирішити цю проблему.
Я шукав у багатьох журналах та попередніх питаннях, і більшість знайдених нами результатів стосувались підрядок, а не про послідовності.
Я також читав, що це можна зробити за допомогою дерев суфіксів, але це теж стосувалося підрядків, і я не впевнений, чи можна продовжити таку ідею для подальшої подачі.
Я шукаю рішення, яке працює в часі . Якщо існує один раз це буде ще краще (я не впевнений, чи існує такий).
$
, який не відображається ні в одному або , а потім запустіть свій -час алгоритм на ньому. Обидві "половинки" найдовшої повторюваної послідовності обов'язково почнуться з, тому одна половина походить від кожного з і , розв’язання задачі LCS.