Я думаю, что эту проблему можно легко решить с помощью префикса .
Рассмотрите строку S[1 .. N]
. Прежде всего, давайте вычислим префикс . После этого шага мы имеем массив P[1 .. N]
, где P[i]
- это длина самого большого суффикса подстроки S[1 .. i]
, которая соответствует его префиксу, P[i] < i
.
Тогда нам просто нужно перебрать всю строку. На каждые i
, i = 2 .. N - 1
мы предполагаем, что средняя строка заканчивается в позиции i
.
В то же время P[i]
самый длинный суффикс S[1 .. i]
, который соответствует его префиксом и P[N]
самый длинный суффикс S[1 .. N]
, который соответствует его префиксом.
Также обратите внимание, что наши подстроки не могут пересекаться. Таким образом, для S[1 .. i]
длина самого длинного суффикса, которая соответствует префиксу и может быть необходимой подстрокой, равна min(P[i], i/2)
. Для S[1 .. N]
длина самого длинного суффикса, которая соответствует префиксу и может быть необходимой подстрокой, ограничена min(P[N], N - i)
.
Так что за каждые i
, i = 2 .. N - 1
мы можем уточнить ответ min(min(P[i], i/2), min(P[N], N - i))
, пытаясь получить максимум.
Это решение имеет желаемую линейную сложность.
Например, если исследованная строка равна "aaaaaa"
, то P
является [0, 1, 2, 3, 4, 5]
.
После этого мы пытаемся обновить ответ:
i = 2 min(min(1, 2/2), min(5, 6 - 2)) = 1
i = 3 min(min(2, 3/2), min(5, 6 - 3)) = 1
i = 4 min(min(3, 4/2), min(5, 6 - 4)) = 2
i = 5 min(min(4, 5/2), min(5, 6 - 5)) = 1
Таким образом, ответ на 2
.
Что делать, если строка имеет длину 10? – timgeb
@timgeb Это может быть возможно. Например, S = aaabaabaaa, тогда здесь ответ 2. Префикс {aa} для индекса 1 и 2, Между {aa} для индекса 5 и 6 и суффикс {aa} для индекса 9 и 10 – GitCoder
и S = aaaaaaaaaa? – timgeb