Линейное время, линейное пространство:
Скажем, входная строка имеет длину n. Создайте массив 5xn, в котором 5 строк представляют совокупное количество S, N, A, K, E для каждого индекса во входном массиве. Назовем эти строки S
, N
, A
, K
и E
.
Отслеживаем 5 индексов, назовем их s
, n
, a
, k
и e
.
Increment `s` until `S[s]` increases by 1 (possibly at s=0).
Increment `n` until `N[n]-N[s]=S[s]`.
Increment `a` until `A[a]-A[n]=S[s]`.
Increment `k` until `K[k]-K[a]=S[s]`.
Increment `e` until `E[e]-E[k]=S[s]`.
Повторите столько раз, сколько сможете. Окончательное число, для которого мы можем выполнить шаги приращения, дает нам ответ.
Среди массивов 5n индексов, и мы только увеличиваем их, так что это линейно по n.
Есть некоторые очевидные оптимизации для улучшения этого, но это не может быть улучшено кроме линейного.
Линейное время, постоянное пространство
Мы будем использовать те же имена индексов, что и раньше, но пусть заглавные буквы представляют совокупное количество S, N после последнего S, K после последнего N и и т.д. * каждый раз, когда мы находим соответствующую букву в индексе <= значение <code>n, a
, k
, e
соответственно.
Установить n=s
и увеличивать n
, добавляя От 1 до N
для каждого N мы находим, пока N=S
Проделайте то же самое для a
, k
, e
.
Как и раньше, последнее время мы можем завершить это, мы нашли ДНК змеи.