1078 字符串压缩与解压 (20 分)

文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示。例如 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

结尾无空行

解题思路: 题目没有什么难点,在一开始读题的时候就看出了一个坑,那就是当压缩的串是一个相同的串的时候的情况,但是到最后因为自己设计算法一开始就给自己挖下的大坑导致第四个测试点过不去,总的来时问题还是有的,第一在做这种题目时,不要过多的去考虑结果的存储,如果结果可以在运算的过程当中直接输出,那就直接输出,千万不要在开辟空间专门存储结果了,不仅没有什么意义,l浪费空间还会给自己留下大坑,切记切记.

加油加油。

//假设原始字符串完全是由英文字母和空格组成的字符串
//如果是字母C 表示下面的字符串是要进行压缩 , 如果是字母D表示下面的字符串要进行解压
//在题目的运行示例中可以看到空格他这里也算是字符
//这个题目一定会出现一些遍历上的问题,但是做法应该就是暴力算法了,嗯....开始吧
#include<iostream>
#include<string>
#include<cctype>
#include<algorithm>
#include<vector>
using namespace std;

int main()
{
	char character;
	cin >> character;
	getchar();//一定要记住在输入一行再起一行的时候,缓冲区会有一个回车留在里面,一定要处理掉
	string ans;
	vector<char>arr;//结果存放的位置
	if (character == 'C')
	{//在这里进行压缩的处理
		getline(cin, ans);
		int size = ans.size();
		int middle = 0;
		for (int i = 0; i < size; ++i)
		{
			if ((i == 0) || (ans[i] == ans[i - 1]))
			{
				middle++;
			}
			else
			{
				if (middle != 1)
					arr.push_back('0' + middle);
				arr.push_back(ans[i - 1]);
				middle = 1;
			}
		}//这里有一个忘了考虑的点,最后那个连续的字符会丢失,所以得补上
		if ((arr.size() == 0) || (arr[arr.size() - 1] != ans[size - 1]))//当俩个数组的最后一个元素不相等的时候,相当于说明最后一个字符串没有记录进去
		{
			int flag = 0;
			if (middle != 1)//这里遇到了一旦都是相同字母时候的情况
			{
				if (middle < 10)
				{
					if (middle == 1)
						arr.push_back(ans[size - 1]);
					else
					{
						arr.push_back('0' + middle);
						arr.push_back(ans[size - 1]);
					}
				}
				else
				{
					vector<char>mmide;
					while (middle >= 10)
					{
						flag = 1;
						int mide = middle % 10;
						mmide.push_back('0' + mide);
						middle = middle / 10;
					}
					arr.push_back('0' + middle);
					if (flag == 1)
					{
						reverse(mmide.begin(), mmide.end());
						for (auto it : mmide)
							arr.push_back(it);
						arr.push_back(ans[size - 1]);
					}
				}
			}
			else
				arr.push_back(ans[size - 1]);
		}
		for (auto it : arr)
		{
			cout << it;
		}
		cout << endl;
	}
	else
	{//在这里进行解压的处理
		getline(cin, ans);
		int size = ans.size();
		int middle = 0;
		for (int i = 0; i < size; ++i)
		{
			if (isalpha(ans[i]) || ans[i] == ' ')
			{
				if (middle == 0)
					cout << ans[i];
				else
					for (int j = 0; j < middle; ++j)
					{
						cout << ans[i];
					}
				middle = 0;
			}
			else {
				if (middle != 0)
				{
					middle = middle * 10;
					int mide = ans[i] - '0';
					middle = middle + mide;
				}
				else
				{
					int mide = ans[i] - '0';
					middle = middle + mide;
				}
			}
		}
	}
	return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值