- // Source: https://www.1point3acres.com/bbs/thread-547993-1-1.html
- class StringCompressor {
- // for continuous_compress
- char continuous_curr_char;
- int continuous_curr_cnt{0};
- // for compress_seqs
- unordered_map<int, string> buffer;
- int next_expected_seq_num{0};
- public:
- vector<pair<char, int>> compressed_tuples(const string& chars) {
- vector<pair<char, int>> res;
- char curr_char;
- int curr_cnt = 0;
- for (char c : chars) {
- if (curr_cnt == 0 || curr_char == c) {
- ++curr_cnt;
- curr_char = c;
- } else {
- res.emplace_back(curr_char, curr_cnt);
- curr_char = c;
- curr_cnt = 1;
- }
- }
- res.emplace_back(curr_char, curr_cnt);
- return res;
- }
- vector<pair<char, int>> continuous_compress(const string& chars) {
- vector<pair<char, int>> res;
- char curr_char = continuous_curr_char;
- int curr_cnt = continuous_curr_cnt;
- for (char c : chars) {
- if (curr_cnt == 0 || curr_char == c) {
- ++curr_cnt;
- curr_char = c;
- } else {
- res.emplace_back(curr_char, curr_cnt);
- curr_char = c;
- curr_cnt = 1;
- }
- }
- continuous_curr_char = curr_char;
- continuous_curr_cnt = curr_cnt;
- return res;
- }
- vector<pair<char, int>> compress_seqs(int seq_num, const string& chars) {
- buffer[seq_num] = chars;
- if (seq_num != next_expected_seq_num) {
- return {};
- }
- string s;
- int curr_seq_num;
- for (curr_seq_num = next_expected_seq_num; buffer.find(curr_seq_num) != buffer.end(); ++curr_seq_num) {
- s += buffer[curr_seq_num];
- buffer.erase(curr_seq_num);
- }
- next_expected_seq_num = curr_seq_num;
- return continuous_compress(s);
- }
- };
- void testCompress() {
- StringCompressor compressor;
- // Expected: {a, 2},{b, 2},{c, 3},
- for (auto p : compressor.compressed_tuples("aabbccc")) {
- cout << "{" << p.first << ", " << p.second << "}," ;
- }
- cout << endl;
- // Expected: {a, 1},{b, 11},
- for (auto p : compressor.compressed_tuples("abbbbbbbbbbb")) {
- cout << "{" << p.first << ", " << p.second << "}," ;
- }
- cout << endl;
- // Expected: {a, 3}, {b, 5}, {c, 2}, {d, 1}
- for (auto p : compressor.continuous_compress("aaabbb")) {
- cout << "{" << p.first << ", " << p.second << "}," ;
- }
- for (auto p : compressor.continuous_compress("bbccd")) {
- cout << "{" << p.first << ", " << p.second << "}," ;
- }
- for (auto p : compressor.continuous_compress("ee")) {
- cout << "{" << p.first << ", " << p.second << "}," ;
- }
- cout << endl;
- compressor = StringCompressor();
- for (auto p : compressor.compress_seqs(2, "ccc")) {
- cout << "{" << p.first << ", " << p.second << "}," ;
- }
- for (auto p : compressor.compress_seqs(1, "bbc")) {
- cout << "{" << p.first << ", " << p.second << "}," ;
- }
- for (auto p : compressor.compress_seqs(0, "aa")) {
- cout << "{" << p.first << ", " << p.second << "}," ;
- }
- for (auto p : compressor.compress_seqs(3, "cdd")) {
- cout << "{" << p.first << ", " << p.second << "}," ;
- }
- cout << endl;
- }
复制代码 |