Как сжать массив,типа string на с++
Нужно сжать массив string по такому алгоритму
дан условный массив string arr = "aaabbc" ,чтобы вышло 3a2bc
Все пробую через ветвление сделать,но уперся в то,что этих условий уже много становится,грубо говоря,чтобы сжать строку по моему методу,при string arr = "aaaaaa" у меня выходит очень много кода,который,как я догадываюсь ,можно заменить несколькими строчками.Плюс появилась проблема,что ,даже если делать моим способом через if ,то я не совсем понимаю как избежать такого результата вывода массива после "сжатия" ,если встречаются в строке несколько повторений по 3+ букв.Примерно так выглядит вывод

Сам способ сжатия вот,
string wordZIP = word;//word- слово,которое рандомно генерируется в другом цикле, его и нужно сжать.
for (int i = 1; i < wordZIP.length(); i++)
{
if (wordZIP[i] == wordZIP[i - 1])
{
wordZIP[i - 1] = '2';
}
}
for (int i = 1; i < wordZIP.length(); i++)
{
if (wordZIP[i] == wordZIP[i - 1] && wordZIP[i] == '2')
{
wordZIP[i - 1] = { '\0' };
wordZIP[i] = '3';
}
}
switch (randomCategory) //randomCategory-ранд.переменная,которая отвечает за распределение по массивам
{
case 1:
slovo1ZIP[i1++] = wordZIP;
break;
case 2:
slovo2ZIP[i2++] = wordZIP;
break;
case 3:
slovo3ZIP[i3++] = wordZIP;
break;
default:
cout << "error";
break;
}
}
P.S.Если подытожить ,то как сделать сжатие, чтобы не было пробелов в слове и не иметь,например при генерации слов из 1 буквы, такой вывод 222222222q при использовании алфавита ,состоящего только из q
Ответы (1 шт):
Вот смотрите:
когда очередной символ не равен предыдущему, запишите в результат разность текущего индекса и индекса старта серии (если эта разница более 1), затем символ в начале серии, потом запомните текущий индекс как старт. Вот, собственно, и всё (конец строки обработать так же)