P8706 [蓝桥杯 2020 省 AB1] 解码 ( 入门 ) 题解

发布时间 2023-11-26 21:56:06作者: BadBadBad__gqc

题目传送门

思路:

有一个原串 \(t\)
将原串 \(t\) 转换成简写字符串 \(s\) 的规则如下:

  • 如果有连续的 \(2\sim9\) 个相同字母,那么可以将它改为字母+数字的格式。
  • 如果是单独的字符,也就是与左右两边的字母都不相同,在简写字符串中一模一样。

所以,现在告诉我们简写字符串,要我们求出原串。
我们可以直接判断下一个字符是否为数字,如果为数字,那么输出数字个当前字符。
如果下一个字符为字母而且当前字符不为数字,那么直接输出当前字母。

Code:

#include <bits/stdc++.h>
using namespace std;
string s;
bool panduan(char a)//判断函数
{
	if(a>='0' and a<='9')
	{
		return true;
	}
	if((a<='z' and a>='a') or (a<='Z' and a>='A'))
	{
		return false;
	}
}
int main()
{
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>s;
	int len=s.size();
	for(int i=0;i<len;i++)
	{
		if(panduan(s[i+1]))//如果下一个字符为整数就输出s[i+1]个s[i]
		{
			int p=s[i+1]-'0';
			while(p--)
			{
				cout<<s[i];
			}
		}
		else if(!panduan(s[i]))//如果下一个不是整数并且当前字符不是数字时直接输出自己
		{
			cout<<s[i];
		}
	}
	return 0;
}