Сжатие строк
Дана строка:
const str = AVVVBBBVVXDHJFFFFDDDDDDHAAAAJJJDDSLSSSDDDD
Необходимо реализовать функцию, принимающую в аргументах строку, состоящую из букв и вернуть новую строку, в которой повторяющиеся буквы заменены количеством повторений.
Примеры:
rle('AVVVBBBVVXDHJFFFFDDDDDDHAAAAJJJDDSLSSSDDDD'); // => 'AV3B3V2XDHJF4D6HA4J3D2SLS3D4';
rle('AVBVVXDHJFFDDDDDDHAAAAJJJDDSLSSSD'); // => 'AV1B1V2XDHJF2D6HA4J3D2SLS3D1';
rle('AVBV'); // => 'AVBV';
rle('AVBVV'); // => 'AVBV2';
Теория: что такое RLE
RLE (run-length encoding) — это подход, при котором строка рассматривается как набор «групп» одинаковых подряд символов.
Например, строка AAABCC разбивается на группы AAA, B, CC, и из них формируется запись вроде A3BC2 (число добавляется только если повторов больше одного).
Почему учитываются только подряд идущие повторы
Повторы считаются только подряд: в строке ABABA нет групп длинее 1, поэтому результат остаётся почти таким же.
Это важное свойство задачи: одинаковые символы, разделённые другими символами, относятся к разным группам и не объединяются.
Теория: алгоритм по шагам
Ниже показана простая «модель» работы алгоритма: берётся текущая позиция, определяется длина группы одинаковых символов, затем группа записывается в ответ.
Вход: A V V V B B B V V X D H J F F F F
Группы: A | VVV | BBB | VV | X | D | H | J | FFFF
Выход: A V3 B3 V2 X D H J F4
Последовательность действий (общая идея для всех вариантов):
- Выбирается символ текущей группы.
- Подсчитывается, сколько раз он повторяется подряд.
- В результат добавляется буква и (если нужно) число повторов.
- Переход выполняется к началу следующей группы и процесс повторяется.
i и j) удобен тем, что «правый» указатель двигается только вперёд, поэтому вся строка просматривается линейно.Практика: проверки, ошибки, сложность
Крайние случаи
- Пустая строка: возвращается пустая строка.
- Строка без повторов: возвращается исходная строка (например,
ABC→ABC). - Строка из одного символа: возвращается этот символ (например,
A→A). - Нестрочный аргумент: выбрасывается
TypeError, чтобы ошибка была явной и понятной.
Таблица: как строится результат
| Вход | Группы | Выход |
|---|---|---|
AVBV | A V B V | AVBV |
AVBVV | A V B VV | AVBV2 |
FFFF | FFFF | F4 |
DDDDDD | DDDDDD | D6 |
- Сложность по времени: O(n), потому что каждый символ участвует в сравнении ограниченное число раз.
- Сложность по памяти: O(n) на результирующую строку, так как в неё накапливается ответ.
Кратко: задача RLE решается линейным проходом по строке с подсчётом длины каждой группы одинаковых подряд символов; в результат добавляется буква и количество повторений только для групп длиной больше 1, а для несовпадающих тестов может применяться режим «всегда добавлять число».