问题分析
1、所给序列如果小于26个字母,则不需要继续考虑,首先不满足题意要求寻找的连续26个字母序列
2、所给序列大于等于26个,开始分析题意发现,目标寻找第一个出现的26个字母序列,每个出现一次,?可以替代成字母,对于所给的字符串,满足第一个出现的序列,最差的情况就是最后26个字母,那我们截取后25个字母之前的字母把它们当做序列的首字母进行遍历。
3、在遍历当前序列时,标记26个字母的出现次数,如果出现超过两次证明该序列失败,跳出进入下一个循环,最后将符合条件的序列中的问号按字典序最小替换成没有出现的字母。
#include<iostream>
#include<iomanip>
#include<algorithm>
#include<cstring>
#include <cstdio>
using namespace std;
int p[27]={0};
int main()
{
string a;
int flag=0;
cin >>a;
//最差的情况是后26个
int l=a.size()-25;
for(int i=0;i<l;i++)
{
memset(p,0,sizeof(p));
flag=0;
string temp=a.substr(i,26);//开始截取字符串
for(int j=0;j<26;j++)
{
if(temp[j]>='A'&&temp[j]<='Z')
{
p[temp[j]-'A']++;
if(p[temp[j]-'A']>1)
{
flag=1;
break;
}
}
}
if(flag) continue;
for(int j=0;j<26;j++)
{
if(p[j]==0)
{
temp[temp.find('?')]=(char)(j+'A');
}
}
cout<<temp<<endl;
break;
}
if(flag) cout<<"-1"<<endl;
}