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];
}
}
}
}