题目内容
在进行数据传输时常使用字符串压缩算法节约资源,小C CC发现在他传输的字符串中有很多连续的字符,他基于这一点创造了以下压缩方法:所有相同且连续的字符串将被压缩成“连续个数+原字符”的形式,例如字符串“A a a a B C AaaaBCAaaaBC”将被压缩为“1 A 3 a 1 B 1 C 1A3a1B1C1A3a1B1C”,字符串“111 A B 11 111AB11111AB11”将被压缩为“311 A 1 B 21 311A1B21311A1B21”。请你帮小C完成压缩程序。
输入
多组样例,第一行包含一个数字T表示样例组数。接下来每组样例占一行,保证输入字符串中只包含大小写字母、数字和空格。需要处理到输入结束(EOF)。
输出
对于每一组输入,输出压缩结果。
样例
输入
3
333 444
ABCD
TJU 1895
输出
331 34
4 1A1B1C1D
1T1J1U1 11181915
提示:每个样例的字符串长度不超过10000 1000010000,所有字符串长度总和不超过1000000 10000001000000.
#include<iostream>
#include<string>
using namespace std;
int main(){
int n;
cin>>n;
//输入的组数大于0才可以继续进行
while(n>0){
//定义输入的字符串
string s;
//cin进行输入时遇到空格代表字符串的输入结束
//这里用getline进行字符串的输入时遇到换行符才会结束该字符串的输入
//一次循环读取一行数据
getline(cin,s);
// 由于缓冲区可能未被刷新,可能会有换行符等,所以此时 s 为空,过滤即可
if (s.empty()) continue;
//读取完之后n-1代表已读完一行
n-=1;
//定义输出字符串
string ans;
for(int i=0;i<s.size();++i){
//此时i=1,j指向i的后一位
int j=i+1;
//比较j所指字符和i所指是否相等 ,不相等时跳出循环
while(j<s.size()&&s[j]==s[i]){
//相等j继续比较下一位
j+=1;
}
// 统计相同字符的数量
ans+=to_string(j-i);
// 记录当前的字符
ans+=s[i];
//循环开始会++i,所以要-1
i=j-1;
}
cout<<ans<<"\n";
}
return 0;
}