参考代码
class Solution {
public:
string num2str(int val){
string ans;
while(val/10){
ans.push_back((char)('0'+val%10));
val/=10;
}
ans.push_back((char)('0'+val%10));
return ans;
}
string compressString(string S) {
string ss=S;
S.push_back('\n');
int left=0,right=1;
int n = S.size();
int ans1[50500];
int ans2[50500];
int cnt=1;
int i = 0;
for(right=1;right<n;right++){
if(S[left]==S[right]){
cnt++;
}else{
ans1[i]=cnt;
ans2[i]=S[left];
i++;
cnt=1;
left=right;
}
}
string ans;
for(int j = 0; j< i;j++){
ans.push_back(ans2[j]);
string tmpstr = num2str(ans1[j]);
int tmpstrlen=tmpstr.size();
for(int k = tmpstrlen-1; k >= 0;k--)
ans.push_back(tmpstr[k]);
}
if(ans.size()+1>=n)return ss;
else
return ans;
}
};
如果限定字符有空格,大小写字母和数字,直接输出压缩结果即可,注意,应该需要将字符出现的次数转化成字符串,如果直接输出出现的次数,输出耗时较长
#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
using namespace std;
int n;
char ch;
int ans1[10050];
int ans2[10050];
int str[10050];
string num2str(int val){
string ans;
while(val/10){
ans.push_back((char)('0'+val%10));
val/=10;
}
ans.push_back((char)('0'+val%10));
return ans;
}
string compressString(string S) {
S.push_back('\n');
int left=0,right=1;
int n = S.size();
int ans1[50500];
int ans2[50500];
int cnt=1;
int i = 0;
for(right=1;right<n;right++){
if(S[left]==S[right]){
cnt++;
}else{
ans1[i]=cnt;
ans2[i]=S[left];
i++;
cnt=1;
left=right;
}
}
string ans;
for(int j = 0; j< i;j++){
ans.push_back(ans2[j]);
string tmpstr = num2str(ans1[j]);
int tmpstrlen=tmpstr.size();
for(int k = tmpstrlen-1; k >= 0;k--)
ans.push_back(tmpstr[k]);
}
return ans;
}
int main(){
/*
cin>>n;scanf("%c",&ch);
for(int i = 0;i <= n;i++){
int length=0;
int cnt=1;
int totlen=0;
while(scanf("%c",&ch),ch!='\n'){
str[length++]=ch;
}
str[length++]=(int)('\n');
if(str[length-1]==ch)cnt++;
else{
ans2[totlen]=str[length-1];
ans1[totlen++]=cnt;
cnt=1;
}
if(length==2){
printf("%d%c",1,str[0]);
}else{
int totlen=0;
int cnt=1;
int left=0,right=1;
while(right<length){
while(str[left]==str[right]){
cnt++;
right++;
}
ans2[totlen]=str[left];
ans1[totlen++]=cnt;
cnt=1;left=right;right++;
}
for(int i = 0;i < totlen;i++)
printf("%d%c",ans1[i],ans2[i]);
printf("\n");
}
}
*/
string S;
int length=0;
int cnt=1;
int totlen=0;
while(scanf("%c",&ch),ch!='\n'){
S.push_back(ch);
}
string ans1 = compressString(S);
cout<<ans1<<endl;
return 0;
}
注:可能上述做法也不是正确解决方案。