首页 > 解决方案 > 运行长度压缩仅用于循环

问题描述

我正在尝试使用运行长度编码。
问题是... a 是 2 次但是 cout show f 是 3。A 没有显示在结果中。最后一个元素计数 var count 保持等于最后一个元素。

#include <iostream>

using namespace std;
int main()
{
    string str = "aafffkhjskk";
    int arr[100];
    int count = 1;
    cout << str << endl;
    // print text on screen

    for (int r = 0; r < str.length(); r++) {
        // Str 0 strating point
        for (int in = r; in < str.length(); in++) {
            // r = in because increment finding element
            if (str[r] == str[in]) {
                count++;
            }
            else {
                r += (count - 1);
                // r value is equal to count
                cout << " r " << r << " count " << count << endl;
                cout << count << " ****** "
                     << str[r] << endl;
                count = 1;
                // making count 1 again.
                break;
            }
        }
    } // for end here
}

标签: c++

解决方案


您选择的r(下一个起始位置)不正确。我建议使用 ar_next来标记下一个字符,它是与当前搜索字符最近的不同字符。pick_next指示是否设置的标志r_next(0 未设置,1 设置)。下一次搜索将设置为从r_next

#include <iostream>
using namespace std;
int main()
{
    string str = "aafffkhjskk";
    int pick_next, r_next, count;
    cout << str << endl;
    int r = 0, count = 0;
    while ((r + count) < str.size()) {
        count = 0; // Str 0 strating point
        pick_next = 0;
        for (int in = r; in < str.length(); in++) {
            // r = in because increment finding element
            if (str[r] == str[in]) {
                count++;
            }
            // mark the first non-identical position
            else {
                if (pick_next == 0) {
                    r_next = in;
                    pick_next = 1;
                }
            }
        }
        cout << "count = " << count << " ****** " << str[r] << endl;
        r = r_next; // place r for next search
    } // end of while
}

Test run:

    $ ./a.exe
    aafffkhjskk
    count = 2 ****** a
    count = 3 ****** f
    count = 3 ****** k
    count = 1 ****** h
    count = 1 ****** j
    count = 1 ****** s
    count = 2 ****** k
--

推荐阅读