One-row keyboard
Задача: вам дана специальная клавиатура, все клавиши которой размещены в один ряд. Ряд длиной в 26 символов.
Изначально ваш курсор находится в индексе 0. Чтобы ввести символ, вы должны переместить курсор в указатель нужного символа. Время, необходимое для перемещения курсора с указателя i на указатель j, равно |i — j|.
Вы хотите ввести слово. Необходимо рассчитать, сколько времени нужно, чтобы набрать ее.
Входные данные: keyboard — строка в 26 символов, все символы — строчные английские буквы; word — слово, которые вам нужно набрать.
Вывод: время, которое необходимо, чтобы набрать входное слово курсором.
Примеры:
- keyboard = “abcdefghijklmnopqrstuvwxyz”, word = “cba”
Output: 4
Пояснение:
‘c’: |0–2| = 2;
‘b’: |2–1| = 1;
‘a’: |1–0| = 1.
В сумме получаем 2 + 1 + 1 = 4. - keyboard = “abcdefghijklmnopqrstuvwxyz”, word = “tag”
Output: 44
Пояснение:
‘t’: |0–19| = 19;
‘a’: |19–0| = 19;
‘g’: |0–6| = 6.
В сумме получаем: 19 + 19 + 6 = 44.
Разбор
Давайте приведем интуитивный алгоритм:
- Сохраним позиции символов нашей клавиатуры. Можно использовать хэш-таблицу или массив длиной 26, т.к. мы используем только строчные буквы английского алфавита — indices[].
- Заводим счетчик текущего курсора pos — он будет указывать на позицию текущего символа для ввода. По умолчанию курсор (счетчик) находится в позици 0.
- Также инициализируем результирующую переменную time = 0.
- Проходим по входному слову, которое необходимо набрать на клавиатуре. На каждой итерации добавляем к time разность по модулю курсора и позицию текущего символа для ввода, т.е. Abs(pos — indices[i]).
- Обновим курсор: теперь он равен indices[i].
- Выводим результат time.
Детали смотрите ниже!
Реализация
https://gist.github.com/unilecs/a8a6d42724421836345576dcc0a56162