文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 ccccc 就用 5c 来表示。如果字符没有重复,就原样输出。例如 aba 压缩后仍然是 aba。
解压方法就是反过来,把形如 5c 这样的表示恢复为 ccccc。
本题需要你根据压缩或解压的要求,对给定字符串进行处理。这里我们简单地假设原始字符串是完全由英文字母和空格组成的非空字符串。
输入格式:
输入第一行给出一个字符,如果是 C 就表示下面的字符串需要被压缩;如果是 D 就表示下面的字符串需要被解压。第二行给出需要被压缩或解压的不超过 1000 个字符的字符串,以回车结尾。题目保证字符重复个数在整型范围内,且输出文件不超过 1MB。
输出格式:
根据要求压缩或解压字符串,并在一行中输出结果。
输入样例 1:
C
TTTTThhiiiis isssss a tesssst CAaaa as
输出样例 1:
5T2h4is i5s a3 te4st CA3a as
输入样例 2:
D
5T2h4is i5s a3 te4st CA3a as10Z
输出样例 2:
TTTTThhiiiis isssss a tesssst CAaaa asZZZZZZZZZZ
分析:
其实也挺简单的,没什么好说的地方。需要注意的一个坑就是相同的字母可能会大于等于10,解压或者压缩的时候需要关注一下。结合代码看一看注释就可以了。逻辑写的有些麻烦了,小姐姐的代码逻辑更为简洁。
#include<iostream>
#include<algorithm>
#include<sstream>
using namespace std;
string Compress(string s){
for(int i = 0; i < s.length(); i++){
if(s[i + 1] == s[i]){
int cnt = 2, j = i + 2;
for(; j < s.length(); j++){
if(s[j] == s[i]) cnt++;
else break;
}
string temp = "";
int num = cnt;
for(int m = 0; num > 0; m++){
temp += num % 10 + '0';
num /= 10;
}
//压缩该部分字符串
s.erase(i + 1, cnt - 1);
reverse(temp.begin(), temp.end());
s.insert(i, temp);
i++;
}
}
return s;
}
string DeCompress(string s){
for(int i = 0; i < s.length() - 1; i++){
//如果遇到了数字
if(s[i] >= '1' && s[i] <= '9'){
string num = "";
char ch;
num += s[i];
int cnt = 0, j = i + 1;
for(; j < s.length() - 1; j++){
if(s[j] >= '0' && s[j] <= '9') num += s[j];
else break;
}
ch = s[j];
//转化为int
ostringstream os;
os << num;
istringstream is(os.str());
is >> cnt;
//解压该部分字符串
s[i] = s[i + 1];
s.erase(i, j - i + 1);
s.insert(i, cnt, ch);
i = i + cnt - 1;
}
}
return s;
}
int main(){
char option;
string s;
cin >> option;
getchar();
getline(cin, s);
if(option == 'C') s = Compress(s);
else if(option == 'D') s = DeCompress(s);
cout << s;
}
本文介绍了一种简单的文本压缩和解压算法,通过将连续重复的字符替换为字符及其出现次数来实现压缩,反之亦然。算法适用于由英文字母和空格组成的字符串,详细解释了压缩和解压的步骤,并提供了C++代码实现。

被折叠的 条评论
为什么被折叠?



