老规矩直接根据最直观的方法进行求解,遇到不通过的用例分析存在的问题,AC代码如下:

class Solution {
public:
    string compressString(string S) {
        int cnt = 1,n = S.size();
        if(n <= 2) return S;

        string res;
        for(int i = 1;i < n;i++)
        {
            if(S[i] == S[i-1])
            {
                cnt += 1;
                if(i == n-1)
                {
                    res += S[i-1];
                    res += to_string(cnt);
                }
            } else if(S[i] != S[i-1]) {
                res += S[i-1];
                res += to_string(cnt);
                cnt = 1;
                if(i == n -1) {
                    res += S[i];
                    res += to_string(cnt);
                }
            }
        }

        return (res.size() < n) ? res:S;
    }
};

运行结果:

执行结果:通过
显示详情
执行用时:8 ms, 在所有 C++ 提交中击败了90.48%的用户
内存消耗:7.3 MB, 在所有 C++ 提交中击败了76.01%的用户

代码虽然很挫,但好歹也通过了,阅读性比较差,两个if else中都有判断i是否等于n-1,优化之后的代码:

class Solution {
public:
    string compressString(string S) {
        int cnt = 1,n = S.size();
        if(n <= 2) return S;

        string res;
        for(int i = 1;i < n;i++)
        {
            if(S[i] == S[i-1])
            {
                cnt += 1;
            } else if(S[i] != S[i-1]) {
                res += S[i-1] + to_string(cnt) ;
                cnt = 1;
            }

            if(i == n-1)
            {
                res += S[i] + to_string(cnt) ;
            }
        }

        return (res.size() < n) ? res:S;
    }
};

优化后的代码看起来清晰不少,运行效率依旧是8ms,击败所有C++提交中的90.48%用户。