Большой Редактировать
На самом деле, по определению, тот факт, что S1
является фиксированной длиной и не зависит от ввода S2
, означает, что ответ @ Amiy правильный. Поскольку indexOf
работает только на S1
, потребуется максимум 26 постоянных шагов. O(26n) = O(n)
. Мой ответ - только нижняя константа, которая варьируется от 1n
до 2n
в зависимости от вариации.
Другое Править
Для общего случая, когда S1
также является переменным вводом, и мы не можем делать никаких предположений по этому поводу, см. Решение хэширования @ user000001 в O(nlogm)
.
Оригинальные ответы
Если вы полагаетесь на тот факт, что S1
отсортирован, и что каждый символ является значением 1 от его соседей, вы можете просто вычислить разницу между символами в S2
и суммировать ее
Например:
S2 = cba
Добавьте a
к S2
, чтобы получить начальное значение:
S2 = acba
Для каждого символа c1
и его правого соседа c2
в S2
,
distance += |c1 - c2|
Если вы не полагаетесь на тот факт, что
S1
отсортирован (что, вероятно, то, что вы ищете), вы можете проиндексировать значения
S1
в массив и применить алгоритм, аналогичный описанному выше:
Например:
S1 = "qwertyuiopasdfghjklzxcvbnm"
arr = array of size 26
let i = 0
for each character c in S1:
arr[c - 'a'] = i++
Затем адаптируйте алгоритм:
S2 = "cba"
let distance = 0
for each character c1 and its right-neighbour c2 in S2:
distance += |arr[c1 - 'a'] - arr[c2 - 'a']|
Оба алгоритма решают проблему в
O(n)
, тогда как первый использует
O(1)
пробел, а второй использует
O(n)
пробел.