Всем привет! Наткнулся на интересную задачку: алгоритм сжатия RLE.
Суть задачи в том, что пользователь вводит строку, а программа выводит ту же строку, но вместо повторяющихся символов выводит их кол-во. Я пока рукожоп, но мне нужна объективная оценка того, что я сделал. Я буду ОЧЕНЬ благодарен любой критике. Собсна, вот код:
#include <iostream>
#include <string>
using namespace std;
int main()
{
setlocale(LC_ALL, "ru");
string str;
cout << "Введите строку: "; getline(cin, str);
int length = str.size(), // длинна строки
tmp = 1, // кол-во повторений каждого элемента
k = length, // длина сжатой строки
a = 0; // индекс для заполнения массива
int *arr = new int[length]; // массив
for (int i = 0; i < length - 1; i++)
{
for (int j = i + 1; j <= length; j++)
{
if (str[i] == str[j])
{
tmp++; // считаем повторения
k--; // уменьшаем длинну
}
else
{
arr[a] = tmp; // записываем кол-во повторений в массив
a++; // переходим дальше по массиву
tmp = 1; // возвращаем значение
i = j; // "перепрыгиваем" через все повторяющиеся элементы
}
}
}
cout << "Исходная строка: " << str << endl << "Сжатая строка: ";
for (int i = 0, a = 0; a < k; i += arr[a], a++) // с помощью i выбираем нужные символы, с помощью a выводим кол-во повторений
{
if (arr[a] == 1) // если символ не повторялся, просто выводим его
{
cout << str[i];
}
else // иначе выводим символ с кол-вом повторений
{
cout << str[i] << arr[a];
}
}
cout << endl;
delete[] arr;
system("pause");
return 0;
}
Результаты работы программы:
1) ввод: aaaaabbcccd
вывод: a5b2c3d
2) ввод: qqiipekkk;;;
вывод: q2i2pek3;3
Ну и заранее спасибо и добра вам! ^_^