字符串压缩
问题描述
有一种简单的字符串压缩算法,对于字符串中连续出现的同一个英文字符,用该字符加上连续出现的次数来表示(连续出现次数小于3时不压缩)。
例如,字符串aaaaabbbabaaaaaaaaaaaaabbbb可压缩为a5b3aba13b4。
请设计一个程序,将采用该压缩方法得到的字符串解压缩,还原出原字符串并输出。
输入说明
输入数据为一个字符串(长度不大于50,只包含字母和数字),表示压缩后的字符串
输出说明
在一行上输出解压缩后的英文字符串(长度不超过100),最后换行。
输入样例
a5b3aba13b4
输出样例
aaaaabbbabaaaaaaaaaaaaabbbb
代码实现
#include <stdio.h>
#include <string.h>
int main() {
char s[10001], c, pos = 0, num = 1, num2 = 0, i = 0;
int n[101];
gets(s);
if (strlen(s) == 0) {//如果是空字符串(好像没有用到)
printf("\n");
return 0;
}
//pos为0时代表上一个是数字或者是刚开始输入,为1时代表上一个也为字母
while (i < strlen(s)) {
if (s[i] >= 'a' && s[i] <= 'z' && pos == 1 || s[i] >= 'A' && s[i] <= 'Z' && pos == 1) {//上一个为字母直接输出
printf("%c", c);
c = s[i];
pos = 1;
}
if (s[i] >= 'a' && s[i] <= 'z' && pos == 0 || s[i] >= 'A' && s[i] <= 'Z' && pos == 0) {//上一个不为字母先存起来
c = s[i];
pos = 1;
}
if (s[i] >= '0' && s[i] <= '9' && pos == 1) {
pos = 0;
n[num] = s[i] - '0';
while (s[num + i ] >= '0' && s[num + i ] <= '9') {
//pos = 0;
num++;//记录位数
n[num] = s[num + i - 1] - '0';//存储各位数字
}
i += num;//进行位置移动
/*if (num == 1 && n[num] == 2) {
printf("%c", s[i - 1]);
continue;
}*/
for (register int j = 1; j <= num; j++) {
num2 *= 10;
num2 += n[j];
}
for (register int j = 1; j <= num2; j++) {
printf("%c", c);
}
num2 = 0;
num = 1;
continue;
}
i++;//进行位置移动
num2 = 0;
num = 1;
}
if (pos == 1) {//如果以单个字母结尾
printf("%c", c);
}
return 0;
}