题目描述
题目分析
题目给定一串序列,问是否存在连续的26个字母,使得其恰好为26个英文字母,其中’?‘是万能字母。若存在输出字典序最小的那一个。
解决方法是箱子存点+滑动窗口,每次固定一个窗口后,向箱子里塞点,若为’?'塞入0号箱,否则塞入’x-64’号箱(利用ASCII码),一旦某个箱子内点超过1个,及时终止——清空箱子,窗口右移。第一次使得所有点之和为26的箱子即为答案。
代码
#include<algorithm>
#include <iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
string str;
int box[27];
int main()
{
bool flag = false;
cin >> str;
int size = str.length();
for (int i = 1; i <= size - 25; i++)
{
memset(box, 0, sizeof(box));
for (int j = i - 1; j <= i + 24; j++)
{
char temp = str[j];
if (temp == '?')
{
box[0]++;
continue;
}
else
{
box[temp - 64]++;
if (box[temp - 64] > 1)
break;
}
}
int num = 0;
for (int k = 1; k <= 26; k++)
if (box[k] == 1)num++;
num += box[0];
if (num == 26)
{
for (int j = i - 1; j <= i + 24; j++)
{
if (str[j] != '?')cout << str[j];
else
for (int i = 1; i <= 26; i++)
if (box[i] == 0)
{
cout << char(i + 64);
box[i] = 1;
break;
}
}
flag = true;
break;
}
}
if (flag == false)
cout << -1;
return 0;
}