C ++中的游程长度编码

时间:2018-10-02 10:20:51

标签: c++ string compression

#include <iostream>
#include <string>
#include <vector>

using namespace std;

string compression(const string & str){
    int i = str.size();
    string letters;
    letters[0] = str[0];
    for (int j = 0; j < i; ++j){
        int count = 1;
        while (str[j] == str[j+1]){
            count++;
            j++;
        }
        letters.push_back('0' + count);
        letters.push_back(str[j]);
    }
    return letters;
}

int main(){
    string input;
    char c;
    try {
        cout << "Enter the data to be compressesed: "<< endl;
        cin >> input;
        for (int z = 0; z < input.length(); ++z){
            c = input.at(z);
        }
        if (!(c >= 'a' && c <= 'z')){
            throw runtime_error("error: invalid input");
        }
    }
    catch (runtime_error& excpt){
        cout << excpt.what() <<endl;
        return 0;
    }
    cout << "The compressed data is " << compression(input) << endl;
    return 0;
} 

预期的输出是,每运行一次字符都会重复一次。这是顺序重复的次数。

一些例子:

aaeeeeae = 2a4e1a1e

rr44errre =无效输入

eeeeeeeeeeeeeeeeeeeeeeeee = 21e

仅当字符连续重复9次或更少时,代码才能正常工作。对于10或更大的值,输入是其他符号。 例如,它在10内保持空白,因此如果输入为'aaaaaaaaaabb',则输出将仅为'a2b'而不是'10a2b'。对于11的输出';', 因此如果输入是'aaaaaaaaaaabb',则由于某种原因输出是'; a2b'。

所以我的问题是,我如何使推回功能适用于所有数字,而不仅限于0-9?

如果您要来这里,谢谢您的时间。 ^^

1 个答案:

答案 0 :(得分:0)

如果您可以使用c ++ 11或更高版本,则函数compression如下所示:

string compression(const string & str){
    int i = str.size();
    string letters;

    for (int j = 0; j < i; ++j){
        int count = 1;
        while (str[j] == str[j+1]){
            count++;
            j++;
        }
        letters += std::to_string(count);
        letters.push_back(str[j]);
    }
    return letters;
}