JuniorКодЧастоЕщё не отвечали
RLE-сжатие строки A-Z без счётчика для одиночных символов
Реализуйте RLE-сжатие строки из букв A-Z. Символ, встретившийся один раз, остаётся как есть; серия более одного символа получает счётчик после символа (например, AAAABBB → A4B3). Бросайте ошибку на любом символе вне A-Z.
Требования:
счётчики (например, A28).
- O(n) время; обработайте пустую строку, последнюю группу и многозначные
std::string rle(const std::string& s) {
// ваш код здесь
}
Допишите реализацию.
Пройдите строку один раз, отслеживая текущий символ и длину его серии. Когда следующий символ отличается, выведите символ, добавьте счётчик только если серия больше одного, затем сбросьте. После цикла выведите последнюю группу. Проверяйте, что каждый символ — A-Z, иначе бросайте ошибку. O(n) время.
- ✗Забывать вывести последнюю серию после окончания цикла
- ✗Добавлять
1для одиночных символов вместо того, чтобы оставлять их без счётчика - ✗Выводить лишь одну цифру многозначного счётчика или пропускать проверку входа
- →Как декодер отличает цифры счётчика от букв при распаковке?
- →Что изменится, если одиночный символ мог бы законно быть цифрой?
Оглавление
Задача
Сожмите строку из A-Z алгоритмом RLE: одиночный символ без счётчика, серия — с счётчиком. Бросайте ошибку на недопустимом символе.
Решение
#include <string>
#include <stdexcept>
std::string rle(const std::string& s) {
std::string out;
for (size_t i = 0; i < s.size(); ) {
char c = s[i];
if (c < 'A' || c > 'Z') throw std::invalid_argument("bad char");
size_t j = i;
while (j < s.size() && s[j] == c) ++j; // длина серии
out += c;
if (j - i > 1) out += std::to_string(j - i);
i = j;
}
return out;
}
Ключевые моменты
- Счётчик добавляется только при длине серии больше одного.
- Цикл
whileсам обрабатывает последнюю группу — отдельный flush не нужен. std::to_stringкорректно выводит многозначные счётчики (A28).
Оглавление