Sample Input_1
ABC??FGHIJK???OPQR?TUVWXY?
Sample Output_1
ABCDEFGHIJKLMNOPQRSTUVWXYZ
Sample Input_2
AABCDEFGHIJKLMNOPQRSTUVW??M
Sample Output_2
-1
解题思路以及关键代码
①对于判断当前26字个符串是否满足题目要求
排序之后,只要相邻的字母没有重复的即可(不包括问号)。
bool func()
{
bool flag = true;
for (int i = 0; i < 25; i++)
{
if (c[i] == c[i + 1] && c[i] != '?' && c[i+1] != '?')
{
flag = false;
break;
}
}
return flag;
}
②对于???应该如何使得输出字典序最小。
这里使用了一个vis【100】数组 并且结合ASCII码 A(65)--------Z (90)标记一下访问过的元素
全部代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
const int maxn = 1000005;
int t, n;
char c[26];
bool vis[100];
bool func()
{
bool flag = true;
for (int i = 0; i < 25; i++)
{
if (c[i] == c[i + 1] && c[i] != '?' && c[i+1] != '?')
{
flag = false;
break;
}
}
return flag;
}
int main()
{
string s;
cin >> s;
int size = s.size() - 26;
for (int i = 0; i <= size; i++)
{
memset(vis, 0, sizeof(vis));
for (int j = 0; j < 26; j++)
c[j] = s[i + j];
sort(c, c + 26);
if (func())
{
for (int j = 0; j < 26; j++)
{
if (s[i + j] >= 65 && s[i + j] <= 90)
vis[s[i + j]] = 1;
}
for (int j = 0; j < 26; j++)
{
if (vis[s[i + j]])
cout << s[i + j];
else
{
for(int ss=65;ss<=90;ss++)
{
char sss;
if(!vis[ss])
{
vis[ss]=1;
sss = ss;
cout<<sss;
break;
}
}
}
}
cout << endl;
return 0;
}
if(i==size)
{
cout<<"-1"<<endl;
}
}
return 0;
}