Cliquez sur le lien résumé complet de solution PAT B -AC
Titre:
compression de texte Il y a plusieurs façons, ici nous ne considérons que le plus simple de type: un segments discrets avec les mêmes caractères et le nombre de caractères de ce fragment contenant le caractère représenté. Par exemple, ccccc
utiliser 5c
pour représenter. Si le personnage ne se répète pas, il est sorti. Par exemple, aba
il continue d'être comprimé aba
.
Procédé de décompression est, à son tour, en forme 5c de rétablir une telle représentation ccccc
.
Votre demande que le besoin de compression ou décompression, pour une chaîne donnée pour le traitement. Ici, nous supposons simplement que la chaîne d'origine est une chaîne non vide entièrement de lettres anglaises et des espaces.
Format d' entrée:
entrée de la première ligne d'un caractère donné, si C
cela signifie que les chaînes suivantes étant comprimé, si D
cela signifie que la chaîne de caractères suivante pour être décompressé. La deuxième ligne donne pas besoin chaîne compressée ou décompressée de 1000 caractères, avec un retour chariot à la fin. Le nombre de caractères répétés dans le titre afin de garantir que l'ensemble des entiers, et le fichier de sortie ne sont pas moins de 1Mo.
Format de sortie:
la compression de la chaîne de demande ou la décompression, et les sorties le résultat sur une ligne.
Entrée Echantillon 1:
C
TTTTThhiiiis isssss a tesssst CAaaa as
Exemple de sortie 1:
5T2h4is i5s a3 te4st CA3a as
Entrée échantillon 2:
D
5T2h4is i5s a3 te4st CA3a as10Z
Exemple 2 de sortie:
TTTTThhiiiis isssss a tesssst CAaaa asZZZZZZZZZZ
Mon code:
#include<iostream>
#include<cstdio>
#include<vector>
#include<string>
#include<set>
#include<map>
#include<algorithm>
#include<cmath>
#include<ctime>
#include<cstring>
#include<sstream>
using namespace std;
//有的时候题目是一起做的,所以会有不需要的头文件
int main()
{
char c;
scanf("%c",&c);
getchar();//如果是scanf("%c\n",&c)case3会报错
string src;
getline(cin,src);
if(c=='C')//压缩
{
for(int i=0;i<src.size();i++)
{
if(src[i]==src[i+1])
{
int j=i+1;
while(j<src.length()&&src[j]==src[i])j++;
int num=j-i;
string temp=to_string(num);
temp+=src[i];
src.replace(i,j-i,temp);//所有相同字母替换
}
}
}
else //解压
{
if(src.length()==0)cout<<" ";//case 2
else
for(int i=0;i<src.size();i++)//解压的时候遍历完整
{
if(src[i]>='0'&&src[i]<='9')
{
int j=i+1;
while(j<src.length()&&src[j]>='0'&&src[j]<='9')j++;
int num=stoi(src.substr(i,j-i));
string temp;
while(num-->0)temp+=src[j];
src.replace(i,j-i+1,temp);//数字和后一个字母替换
}
}
}
cout<<src;
return 0;
}
Remarque: Si scanf ( "% c \ n", etc.) affaire3 étant donné, je ne sais pas pourquoi, vous devez utiliser getchar ();
Remarque: le cas 2 sorties un espace décompressé de l'affaire;