Задачи
December 10

Сжимаем строки: эффективный алгоритм работы с повторяющимися символами

Задача. Дана строка str, необходимо сжать ее следующим образом. Если строка не пустая, выполните следующую операцию:

  • Удалите из слова префикс максимальной длины, состоящий из одного символа str[i], повторяющегося не более 9 раз.
  • Добавьте к результирующей строке длину префикса, за которым следует символ str[i].

Примеры:

1. str = "abcde"
Output: "1a1b1c1d1e"

2. str = "aaaaaaaaaaaaaabb"
Output: "9a5a2b"

Разбор

При обходе строки, запускаем вложенный цикл, который для текущего символа найдет количество его следующих повторений, но не более 9 раз.

Далее мы добавим символ и количество его повторений в результирующую строку.

Реализация

static string CompressedStr(string str) {
    var res = new StringBuilder();
    int index = 0;

    while (index < str.Length)
    {
        int count = 0;
        var curr = str[index];

        while(index < str.Length && count < 9 && str[index] == curr) {
            count++;
            index++;
        }

        res.Append(count).Append(curr);
    }

    return res.ToString();
}

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

Play-test

https://dotnetfiddle.net/IDJED6