题目
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/2aea6092ccc003a3ce05a2b03f7a0cf5.png#pic_center)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/21c843c489076c7e138078b3af85cca7.png#pic_center)
![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/479e769ab3c36df9b5da292e667c70d0.png#pic_center)
题目思路
从第一个字母开始存储,利用map记录当前字母是否已经放进输出的序列中,如果出现一个字母,此时输出序列中的字母个数不到26(包括?),且输出序列中已经存在,那么我们就从序列的头开始删除,直到当前的字母可以放入输出序列中,当num(记录序列长度)等于26时,那么停止遍历,开始输出当前已经记录的序列,对于'?'的地方,根据字典序填充字母,然后输出。
代码实现
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
const int inf=0x3f3f3f3f;
char a[1000005],b[30];
char temp;
int n,num,i,ans;
bool flag;
map<char,int> item;
int main()
{
i=0;ans=0;flag=false;
while(scanf("%c",&a[i])!=EOF)
{
if(a[i]=='?')
{
num++;
i++;
if(num==26)
{
flag=true;
break;
}
continue;
}
if(item.find(a[i])==item.end())
{
item[a[i]]=1;
num++;
}
else
{
int q=ans;
while(item.find(a[i])!=item.end())
{
if(a[q]!='?')
item.erase(a[q]);
q++;
num--;
ans++;
}
item[a[i]]=1;
num++;
}
if(num==26)
{
flag=true;
break;
}
i++;
}
if(flag==false)
{
cout<<-1;
return 0;
}
else{
for(int t=ans;t<26+ans;t++)
{
if(a[t]=='?')
{
temp=65;
while(item.find(temp)!=item.end())
{
temp=temp+1;
}
item[temp]=1;
a[t]=temp;
}
cout<<a[t];
}
}
return 0;
}