1. 程式人生 > >PAT 乙級 1078 字串壓縮與解壓

PAT 乙級 1078 字串壓縮與解壓

1078 字串壓縮與解壓 (20 point(s))

文字壓縮有很多種方法,這裡我們只考慮最簡單的一種:把由相同字元組成的一個連續的片段用這個字元和片段中含有這個字元的個數來表示。例如 ccccc 就用 5c 來表示。如果字元沒有重複,就原樣輸出。例如 aba 壓縮後仍然是 aba

解壓方法就是反過來,把形如 5c 這樣的表示恢復為 ccccc

本題需要你根據壓縮或解壓的要求,對給定字串進行處理。這裡我們簡單地假設原始字串是完全由英文字母和空格組成的非空字串。

輸入格式:

輸入第一行給出一個字元,如果是 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

經驗總結:

這一題....比較麻煩的就是處理字串,遇到這樣的題目就很頭大,還好這題沒什麼太多的坑,勉強通過了= =,就,注意空格也是要壓縮的,把空格當成和字母一樣就行了,還有,注意壓縮的字元數量可能超過10,這裡使用sprintf可以很好的處理~就這樣啦~

AC程式碼

#include <cstdio>
#include <vector>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <iostream>
using namespace std;
const int maxn=100010;

string compress(string str)
{
	string temp;
	char F=str[0];
	char t[6];
	int num=1;
	for(int i=1;i<str.size();++i)
	{
		if(str[i]==F)
		{
			++num;
		}
		else
		{
			if(num!=1)
			{
				sprintf(t,"%d",num);
				for(int i=0;i<strlen(t);++i)
					temp+=t[i];
			}
			temp+=F;
			F=str[i];
			num=1;
		}
	}
	if(num!=1)
	{
		sprintf(t,"%d",num);
		for(int i=0;i<strlen(t);++i)
			temp+=t[i];
	}
	temp+=F;
	return temp;
}
string decompress(string str)
{
	string temp;
	int index=0;
	char a[6];
	for(int i=0;i<str.size();++i)
	{
		if(isdigit(str[i]))
		{
			a[index++]=str[i];
		}
		else
		{
			if(index!=0)
			{
				int count;
				a[index]='\0';
				sscanf(a,"%d",&count);
				for(int j=0;j<count;++j)
					temp+=str[i];
				index=0;
			}
			else
				temp+=str[i];
		}
	}
	return temp;
}
int main()
{
	int n,score,g1,t;
	char F;
	string temp;
	scanf("%c",&F);
	getchar();
	getline(cin,temp);
	if(F=='C')
		cout<<compress(temp);
	else
		cout<<decompress(temp);
	return 0;
}