程序员面试金典——面试题01.06.字符串压缩

一、题目介绍

字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。

示例1:

 输入:"aabcccccaaa"
 输出:"a2b1c5a3"
示例2:

 输入:"abbccd"
 输出:"abbccd"
 解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:

字符串长度在[0, 50000]范围内。

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/compress-string-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

二、解题思路

        字符串压缩的方式就是将连续出现的相同字符按照 字符 + 出现次数 压缩。如果压缩后的字符串长度变短,则返回压缩后的字符串,否则保留原来的字符串。

        本题如果使用string类型的对象很容易实现,即按照压缩方式将给定字符串压缩,最后再比较压缩前后字符串的长度,返回长度较短的字符串即可。为了避免string对象随着长度不断增加,而带来的存储空间的再分配和复制的问题,可以动态申请固定长度的动态数组来完成上述过程。

三、解题代码

class Solution {
public:
    string compressString(string S) {
        int i = 0, j = 0;
        int len = S.size();
        if(len <= 2)
            return S;
        char *s = new char[len+5]; //因为字符长度最大是50000,即5位数
        char ch = S[0];
        int count = 1;
        for(i = 1; i <= len; ++i)
        {
            if(S[i] == ch)
                ++count;
            else if(S[i] != ch && j < len)
            {
                //压缩之前的字符
                s[j++] = ch;
                string str = to_string(count); //数字转成字符串
                for(int k = 0; k < str.size(); ++k)
                {
                    s[j++] = str[k]; 
                }
                if(j >= len)
                    return S;
                //记录下一个字符
                ch = S[i];
                count = 1;
            }   
        }
        s[j] = '\0';
        return string(s);
    }
};

四、解题结果

猜你喜欢

转载自blog.csdn.net/qq_39661206/article/details/105629294