目录
题目:
字符串压缩。利用字符重复出现的次数,编写一种方法,实现基本的字符串压缩功能。比如,字符串aabcccccaaa会变为a2b1c5a3。若“压缩”后的字符串没有变短,则返回原先的字符串。你可以假设字符串中只包含大小写英文字母(a至z)。
示例1:
输入:"aabcccccaaa"
输出:"a2b1c5a3"
示例2:
输入:"abbccd"
输出:"abbccd"
解释:"abbccd"压缩后为"a1b2c2d1",比原字符串长度更长。
提示:
字符串长度在[0, 50000]范围内。
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/compress-string-lcci
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
代码实现:
char* compressString(char* S)
{
char* ret = (char*)malloc(sizeof(char) * 100000);//注意一定要开辟符合题目要求的足够大的空间
char* start = S;//记录此字符串的首地址,S会用来遍历字符串,不再是首地址了
int len = 0;
while (*S)//每一轮循环的初始*S就是一片连续相同字符的首个字符
{
char c = *S;//记录一篇连续相同字符的首个字符
int count = 0;
while (*S == c)//统计一片连续字符的个数
{
count++;
S++;
}
len += sprintf(ret + len, "%c%d", c, count);//sprintf的返回值是写入的字符总数
}
int len2 = strlen(start);
return strlen(ret) >= len2 ? start : ret;
}
思路详解:
1 一层while外循环用于循环到每个一片连续相同字符的首字符,并记录下这个首字符
从首字符的位置开始计数,统计与首字符连续相同字符的个数,使用另一层while内循环
当遇到一个不同的字符,则内循环结束,统计结束,将原先记录好的首字符与统计个数使用sprintf写入开辟好的空间中
2 sprintf的使用:将格式化数据写入字符串
通俗来说就是将格式化的数据(整型,浮点型等有打印格式要求的,如%d,%c等)转化成字符串的形式,当sprintf写入数据结束后,终止空字符会自动追加到内容之后
int sprintf ( char * str, const char * format, ... );
返回值:成功后,将返回写入的字符总数。此计数不包括自动追加在字符串末尾的其他 null 字符。
失败时,返回负数
3 所以用sprintf我们可以将首字符+统计个数作为一个整体,一并写入开辟的空间内
需要注意的是,sprintf写入一次数据后,下次写入数据的位置需要我们自己设计改变
len += sprintf(ret + len, "%c%d", c, count)
sprintf的返回值是写入的字符总数,利用这个我们可以轻松找到下一个位置:ret+len
len可以接收sprintf的返回值,这样len代表的就是空间中已有的字符个数
ret+len就可以找到开辟好的空间已经存放的字符中最后一个字符的下一个位置啦
完结撒花~