问题描述
小明在整理历史文献时发现了一种古老的压缩字符串,其规则如下:将连续重复的字符用"字符+出现次数"的形式表示。例如,"aaabb"会被压缩成"a3b2"。现在小明需要编写一个解压缩程序,将这种格式的字符串恢复成原始形式。
要求:
- 设计一个算法处理输入字符串,输出解压后的完整字符串
- 保证输入字符串格式正确,且解压后的字符串长度不超过1000个字符
- 注意处理多位数字的情况,如"a12"表示12个连续的'a'
测试样例
样例1:
输入:
"a3b2c1"输出:"aaabbc"解释:a出现3次(即"aaa"),b出现2次(即"bb"),c出现1次(即"c"),所以解压后为"aaabbc"
样例2:
输入:
"x1y5z2"输出:"xyyyyyzz"解释:x出现1次(即"x"),y出现5次(即"yyyyy"),z出现2次(即"zz"),所以解压后为"xyyyyyzz"
样例3:
输入:
"w2e10f3"输出:"wweeeeeeeeeefff"解释:w出现2次(即"ww"),e出现10次(即"eeeeeeeeee"),f出现3次(即"fff"),所以解压后为"wweeeeeeeeeefff"。注意这里e10表示10个e,展示了多位数字的处理。
约束条件
- 输入字符串长度在1到100之间
- 字符均为小写英文字母(a-z)
- 出现次数为1到1000的正整数
- 解压后的字符串长度不超过1000个字符
- 输入格式保证正确,总是"字符+数字"交替出现
程序代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char* decompress(char* s) {
int n = strlen(s);
char* result = (char*)malloc(1001 * sizeof(char)); // 最大1000字符
int idx = 0;
int i = 0;
while (i < n) {
// 读取字符
char ch = s[i++];
// 读取数字(可能多位)
int count = 0;
while (i < n && s[i] >= '0' && s[i] <= '9') {
count = count * 10 + (s[i] - '0');
i++;
}
// 重复字符 count 次
for (int j = 0; j < count; j++) {
result[idx++] = ch;
}
}
result[idx] = '\0';
return result;
}
int main() {
char* r1 = decompress("a3b2c1");
char* r2 = decompress("x1y5z2");
char* r3 = decompress("w2e10f3");
printf("%s\n", r1); // aaabbc
printf("%s\n", r2); // xyyyyyzz
printf("%s\n", r3); // wweeeeeeeeeefff
free(r1);
free(r2);
free(r3);
return 0;
}
#include <stdio.h> #include <stdlib.h> #include <string.h> char* decompress(char* s) { int n = strlen(s); char* result = (char*)malloc(1001 * sizeof(char)); // 最大1000字符 int idx = 0; int i = 0; while (i < n) { // 读取字符 char ch = s[i++]; // 读取数字(可能多位) int count = 0; while (i < n && s[i] >= '0' && s[i] <= '9') { count = count * 10 + (s[i] - '0'); i++; } // 重复字符 count 次 for (int j = 0; j < count; j++) { result[idx++] = ch; } } result[idx] = '\0'; return result; } int main() { char* r1 = decompress("a3b2c1"); char* r2 = decompress("x1y5z2"); char* r3 = decompress("w2e10f3"); printf("%s\n", r1); // aaabbc printf("%s\n", r2); // xyyyyyzz printf("%s\n", r3); // wweeeeeeeeeefff free(r1); free(r2); free(r3); return 0; }