c语言 字符串的压缩 例如:aaabbbcccaaaddd--->压缩为3a3b3c3a3d
时间: 2024-10-06 11:01:59 浏览: 35
leetcode不会-394.-Decode-String-c-Leetcode:394.-解码字符串-c-Leetcode
在C语言中,字符串的压缩通常涉及到数据结构和算法的使用,特别是哈希表或数组来记录字符及其出现次数。这里简单描述一种简单的实现思路:
1. 定义一个数组或动态数组(如`char compressed[100]`),用于存储压缩后的结果和每个字符的计数。
2. 遍历原始字符串(`const char *str = "aaabbbcccaaaddd"`)。创建两个指针,一个指向当前字符,另一个(初始值设为`compressed + 1`)用于追加压缩后的字符到`compressed`数组。
3. 当遇到相同的字符时,更新`compressed`数组中对应字符的计数,例如`compressed[count++] = 'a';`。同时,递增计数器`count`。
4. 如果遇到不同的字符,先将上一个字符和计数值添加到`compressed`,比如`*compressed++ = count; compressed[] = 'd'; count = 1;`,然后将新字符作为新的开始。
5. 最后别忘了处理遍历结束的情况,如果还有剩余的计数(即`count > 1`),也需要添加到`compressed`数组。
6. 将压缩后的字符串复制回一个新的缓冲区,并将其转换成有效的C字符串(通过`\0`终止)。
示例代码:
```c
#include <stdio.h>
#include <string.h>
void compress(char* input, char* output) {
int count = 1;
int out_index = 0;
for (int i = 1; input[i]; i++) {
if (input[i] == input[i - 1]) {
count++;
} else {
output[out_index++] = count + '0';
output[out_index++] = input[i - 1];
count = 1;
}
}
// 处理最后一个字符
if (count > 1) {
output[out_index++] = count + '0';
output[out_index] = '\0';
} else {
output[out_index] = '\0';
}
}
int main() {
const char* str = "aaabbbcccaaaddd";
char compressed[strlen(str) * 3]; // 压缩后长度估计
compress(str, compressed);
printf("Compressed string: %s\n", compressed);
return 0;
}
```
注意:这个例子简化了问题,实际场景可能需要考虑性能优化、内存分配以及错误处理等问题。此外,由于压缩过程中可能存在溢出风险,实际实现中应使用更安全的数据结构(如`std::pair<char, size_t>`)代替字符数组和整数计数。
阅读全文