PAT B -1078 스트링 압축 및 압축 해제 (20 분)

링크를 클릭 전체 솔루션 요약 PAT B - AC

제목 :
텍스트 압축 여기에 여러 가지 방법이 있습니다 우리는 가장 간단한 종류를 고려 : 같은 문자와 문자를 포함하는이 단편의 문자 번호로 개별 세그먼트를 대표했다. 예를 들어, ccccc사용하는 5c표현하기. 문자가 반복되지 않는 경우가 출력됩니다. 예를 들어, aba그것은 압축 계속 aba.

복원 방법은 차례로, 이러한 표현을 복원하는 (c) 모양이다 ccccc.

귀하의 요청이 처리를위한 주어진 문자열에 대한 압축과 압축 해제의 필요성. 여기에서 우리는 단순히 원래 문자열이 완전히 영어 문자와 공간의 비어 있지 않은 문자열이 있다고 가정합니다.

입력 형식 :
주어진 문자의 제 1 라인의 입력이있는 경우 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

내 코드 :

#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;
}

참고 : scanf와 ( "% (C)가 \ n", & C) case3이 주어지고, 나는 이유를 알 수없는 경우, 당신은 getchar가 ()를 사용한다;
주 : 상기 케이스의 압축 해제 공간 출력 케이스 (2);

게시 82 개 원래 기사 · 원 찬양 한 · 전망 1657

추천

출처blog.csdn.net/qq_34451909/article/details/104989151