ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1078 字符串压缩与解压——20分

2022-08-15 12:03:56  阅读:152  来源: 互联网

标签:解压 字符 20 1078 输出 压缩 样例 字符串


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

| 代码长度限制 | 时间限制 | 内存限制 |
| 16KB | 400ms | 64MB |

代码:

#include<bits/stdtr1c++.h>
using namespace std;
void slove1(string s) {
	for (int i = 0; i < int(s.size()); i++) {
		int cnt = 0;
		while (s[i] == s[i + 1])
			i++, cnt++; //向后移位同时记录连续相同字符的数量
		if (cnt != 0) cout << cnt + 1;
		cout << s[i];
	}
}
void slove2(string s) {
	for (int i = 0; i < int(s.size()); i++) {
		string sum = "";
		while (isdigit(s[i]))
			sum += s[i++]; //将字符串中每一位0~9数字形式的字符存入sum中,便于转成int型的数字
		if (sum != "") //说明有连续相同的多个字符
			for (int j = 0; j < stoi(sum); j++) cout << s[i]; //输出多个字符
		else
			cout << s[i]; //如果sum为空,说明字符并不连续,只有一个
	}
}
int main() {
	char c;
	string s;
	cin >> c;
	getchar();
	getline(cin, s);
	if (c == 'C')
		slove1(s); //压缩字符串
	else if (c == 'D')
		slove2(s); //解压字符串
	return 0;
}

标签:解压,字符,20,1078,输出,压缩,样例,字符串
来源: https://www.cnblogs.com/Fare-well/p/16587777.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有