タイトル:HRZで英語を学ぶ
タイトル:
入力:タイトルの説明と一致する文字列を1行だけ入力します。
出力:出力は1行のみです。そのようなサブストリングがある場合は出力してください。それ以外の場合は-1を出力してください。
サンプル:
問題解決のアイデア:1e6を見てください、わかりました、直接の暴力は通用します。最初から検索し、状況に一致する26語がある場合は、最小文字順序出力を判断します。
コード:
#include<iostream>
#include<cstring>
#include<cstdlib>
using namespace std;
int a[26]={0};//a数组标记字母是否被选过
string y="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
string sol(string m)
{
for(int i=0;i<m.size();i++)
{
if(m[i]=='?')
{
for(int j=0;j<26;j++)
{
if(a[j]==0)//从头开始搜,看哪个没被标记
{
m[i]=y[j];
a[j]=1;//标记一下
break;
}
}
}
}
return m;
}
int main()
{
string t;
cin>>t;
int q=0;
for(int i=0;i<t.size();i++)//从头开始
{
memset(a,0,sizeof(a));
int flag=0;
string m="";
for(int j=i;j<i+26;j++)//直接搜索
{
m+=t[j];
if(t[j]!='?')//判断一下
{
if(a[int(t[j]-'A')]==0)//如果为0,通过
{
a[int(t[j]-'A')]=1;
}else//不然gg
{
flag=1;
break;
}
}
}
if(flag==0)//通过的话,找最小字符序
{
q=1;
string h=sol(m);
cout<<h;
break;
}
if(i+26==t.size())//上界
{
break;
}
}
if(q==0)
{
cout<<-1;
}
}