One-row keyboard

Albert Davletov
UniLecs
Published in
2 min readOct 22, 2021

--

Задача: вам дана специальная клавиатура, все клавиши которой размещены в один ряд. Ряд длиной в 26 символов.
Изначально ваш курсор находится в индексе 0. Чтобы ввести символ, вы должны переместить курсор в указатель нужного символа. Время, необходимое для перемещения курсора с указателя i на указатель j, равно |i — j|.

Вы хотите ввести слово. Необходимо рассчитать, сколько времени нужно, чтобы набрать ее.

Входные данные: keyboard — строка в 26 символов, все символы — строчные английские буквы; word — слово, которые вам нужно набрать.

Вывод: время, которое необходимо, чтобы набрать входное слово курсором.

Примеры:

  1. keyboard = “abcdefghijklmnopqrstuvwxyz”, word = “cba”
    Output: 4
    Пояснение:
    ‘c’: |0–2| = 2;
    ‘b’: |2–1| = 1;
    ‘a’: |1–0| = 1.
    В сумме получаем 2 + 1 + 1 = 4.
  2. keyboard = “abcdefghijklmnopqrstuvwxyz”, word = “tag”
    Output: 44
    Пояснение:
    ‘t’: |0–19| = 19;
    ‘a’: |19–0| = 19;
    ‘g’: |0–6| = 6.
    В сумме получаем: 19 + 19 + 6 = 44.

Разбор

Давайте приведем интуитивный алгоритм:

  1. Сохраним позиции символов нашей клавиатуры. Можно использовать хэш-таблицу или массив длиной 26, т.к. мы используем только строчные буквы английского алфавита — indices[].
  2. Заводим счетчик текущего курсора pos — он будет указывать на позицию текущего символа для ввода. По умолчанию курсор (счетчик) находится в позици 0.
  3. Также инициализируем результирующую переменную time = 0.
  4. Проходим по входному слову, которое необходимо набрать на клавиатуре. На каждой итерации добавляем к time разность по модулю курсора и позицию текущего символа для ввода, т.е. Abs(pos — indices[i]).
  5. Обновим курсор: теперь он равен indices[i].
  6. Выводим результат time.

Детали смотрите ниже!

Реализация

C#

https://gist.github.com/unilecs/a8a6d42724421836345576dcc0a56162

Play-test

https://dotnetfiddle.net/TU3PVj

--

--