Сжатие строк

Дана строка:

 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) удобен тем, что «правый» указатель двигается только вперёд, поэтому вся строка просматривается линейно.

Практика: проверки, ошибки, сложность

Крайние случаи

  • Пустая строка: возвращается пустая строка.
  • Строка без повторов: возвращается исходная строка (например, ABCABC).
  • Строка из одного символа: возвращается этот символ (например, AA).
  • Нестрочный аргумент: выбрасывается TypeError, чтобы ошибка была явной и понятной.

Таблица: как строится результат

ВходГруппыВыход
AVBVA V B VAVBV
AVBVVA V B VVAVBV2
FFFFFFFFF4
DDDDDDDDDDDDD6
  • Сложность по времени: O(n), потому что каждый символ участвует в сравнении ограниченное число раз.
  • Сложность по памяти: O(n) на результирующую строку, так как в неё накапливается ответ.

Кратко: задача RLE решается линейным проходом по строке с подсчётом длины каждой группы одинаковых подряд символов; в результат добавляется буква и количество повторений только для групп длиной больше 1, а для несовпадающих тестов может применяться режим «всегда добавлять число».