PAT B -1078 compression et de décompression de chaîne (20 minutes)

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, cccccutiliser 5cpour représenter. Si le personnage ne se répète pas, il est sorti. Par exemple, abail 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 Ccela signifie que les chaînes suivantes étant comprimé, si Dcela 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;

Publié 82 articles originaux · a gagné les éloges 1 · views 1657

Je suppose que tu aimes

Origine blog.csdn.net/qq_34451909/article/details/104989151
conseillé
Classement