Проблема на удивление нетривиальна. Во-первых, два алгоритма грубой силы. Квадрат («повторяющийся шаблон») определяется его длиной и позицией , и для его проверки требуется время . Если мы переберем все и , мы получим алгоритм . Мы можем улучшить это, сначала зацикливая на , а затем сканируя строку с двумя бегущими указателями на расстоянии . Таким образом, можно проверить, существует ли квадрат длины за линейное время, давая общее время работы .ℓпO ( ℓ )ℓпO ( n3)ℓℓ2 ℓO ( n2)
Колпаков и Кучеров разработали алгоритм нахождения всех максимальных повторов в слове за время [1], и их алгоритм можно использовать для нахождения всех максимальных квадратов за время . Повтор подслово вида , где и является собственным префиксом . Самый большой квадрат, содержащийся в этом повторении: . Используя эту формулу, учитывая все максимальные повторения в слове (из которых только много), можно найти самый большой квадрат.O ( n )O ( n )весКИксk ≥ 2Иксвес( ш⌊ к / 2 ⌋)2O ( n )
[1] Колпаков Р., Кучеров Г. (1999). Нахождение максимальных повторений в слове за линейное время . В Основы информатики, 1999. 40-й ежегодный симпозиум (стр. 596-604). IEEE.
142857
это не самое длинное, потому что142857142857
оно длиннее. Я думаю, что вы должны отредактировать вопрос, чтобы уточнить, что вы подразумеваете под «повторяющимся шаблоном».