CSP-M2 B题

B-HRZ学英语

题目描述:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
解题思路:
我们在遍历这个string的时候,存在三种情况
①这个字母之前出现过,那么我们要从这个地方开始重新开始记录,因为26个字母不重复
②这个字符是’?’
如果此时i-l+1= =26则满足题意,跳出,否则继续
③既没有存在,又不是?则继续
当此时的i-l+1 = =26时跳出
输出:
当r==-1时,说明字符串不存在
否则,从此时的l开始,一直到我们的r,当这个字符为‘?’时,我们就要选择字典序最小的情况,找到第一个不存在的字母并输出,如果不是?则正常输出就好
代码如下:

#include<string>
#include<iostream>
using namespace std;

bool e[26] = { false };
long long a[26];

int main()
{
	string s;
	cin >> s;
	long long l = 0, r = -1,size = s.size();
	for (long long i = 0; i < size; i++)
	{
		if (e[s[i] - 'A'] == true) //existed
		{
			for (long long j = l; j < a[s[i] - 'A']; j++)
			{
				e[s[j] - 'A'] = false;
			}
			l = a[s[i] - 'A'] + 1; //l to 上一次出现的后面
			a[s[i] - 'A'] = i;//lo重定位
		}
		if (s[i] == '?')
		{
			if ((i - l + 1) == 26)
			{
				r = i;
				break;
			}
			else continue;
		}
		else
		{
			e[s[i] - 'A'] = true;
			a[s[i] - 'A'] = i;
		}
		if ((i - l + 1) == 26)
		{
			r = i;
			break;
		}
	}

	if (r == -1)	cout << -1;
	else
	{
		int now = 0;
		for (long long i = l; i <= r; i++)
		{
			if (s[i] == '?')
			{
				for (int j = now; j < 26; j++)
				{
					if (e[j] == false)
					{
						cout << (char)(j + 'A');
						now = j + 1;
						break;
					}
				}
			}
			else
			{
				cout << s[i];
			}
		}
	}
}

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值