一、题目介绍
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串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);
}
};