题目:
题解:
整个实验其实就是对于一个字符串对其进行处理。我在这个题中,是通过ascall码,将大写字母和?传换成数字,使用数组进行处理。用27个单位大小的数组计算每一个字符出现的次数。如果出现一次的大写字符的个数与?出现的次数相加等于26,那么整个字符串可以替换成我们想要的形式。
对于字符串的处理,是将其看作字符数组的方法,使用类似尺取法的滑动窗口进行字符串的截取以及每移动一个单位的变化。
至于字典序最小,就是将没有出现的字符依次和?进行替换即可
#include <iostream>
#include<stdio.h>
#include<stdlib.h>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include<queue>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
int num(char a)
{
if(a=='?')
{
return a-63;
}
else return a-64;
}
bool is(int *a)
{
int zero=a[0];
int one=0;
for(int i=1;i<=26;i++)
{
if(a[i]==1) one++;
}
if(zero+one==26) return true;
else return false;
}
int main(int argc, char** argv) {
string s;
cin>>s;
int position=-1;
long long n=s.size();
int a[100];
memset(a,0,sizeof(a));
bool wk=false;
for(int i=0;i<26;i++)
{
a[num(s[i])]++;
}
if(is(a))
{
wk=true;
position=0;
}
else
{
for(int i=26;i<n;i++)
{
a[num(s[i-26])]--;
a[num(s[i])]++;
if(is(a))
{
position=i-25;
wk=true;
break;
}
}
}
if(wk)
{
int j=1;
for(int i=position;i<position+26;i++)
{
if(s[i]!='?') cout<<s[i];
else
{
while(a[j]==1) j++;
a[0]--;
a[j]++;
cout<<(char)(j+64);
}
}
}
else
{
cout<<-1;
}
return 0;
}
反思:
测试时因为粗心导致输出的时候,字符串的位置搞错了。