我的题解错了,帮忙看看
错误原因:很遗憾,您上传的题解 Complete the Word的题解 未能通过审核。原因是 句子末尾应加句末句号(全角或半角,全文统一);普通英文内容(一般英文单词、题目名、算法名、人名等)不应该使用 LaTeX 公式; 。
首先先讲一下主要的题目意思:
### 给出一个字符串,判断其是否存在一个子串(满足:包含 $26$ 个英文字母且不重复,字串中有 $?$ 表示占位符可表示字母),如果存在则输出该字串 $?$ 位置用替换后的字母代替,其他不在子串中的 $?$ 用字母代替即可。如果该字串不存在满足条件的子串,则输出 $-1$ 。
现在咋满读懂了题目,我们就可以先来看看这一题的思路:解题思路:
## 方法:暴力(~~有句话叫:暴力TLE,但这一题我们暴力不会TLE~~)
### ·首先判断是否满足长度为$\le 26$ ,那么直接输出 $ -1$ 。
### ·否则:双重 for 扫描,内循环每次从 $i$ 到 $i + 25$ 即可,如果 字符出现的个数$+$ $?$ 的个数 $=$ $26$ ,则该子串满足,则记录左边的下标即可。
### ·然后找出没有出现的字符,放在数组 $\text{x[ ]}$ 。for循环,从记录下标开始到下标+25,如果是 $? $,则用 $x[k++]$ 代替 $?$ 。替换完子串 $?$ ,遍历整个字串,如果是 $?$ 用 $A$ 代替即可。
最后把结果输出就行了。
```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
char str[N];
int main()
{
int i,j;
while(sstrnf("%s",str)!=EOF)
{
if(strlen(str)<26)
{
printf("-1\n");
continue;
}
int cut,l,r,w;int dp[500];
for(i=0; i<strlen(str); i++)
{
memset(dp,0,sizeof(dp));
cut=w=l=r=0;
for(j=i; j<i+26; j++)
if(str[j]=='?')w++;
else if(!dp[str[j]]&&(int)str[j]!=0)
++cut,dp[str[j]]=1;
if(cut+w==26)
{
l=i;
r=l+25;
break;
}
}
if(r==0)
{
printf("-1\n");
continue;
}
else
{
char s[26],tem[26];
int k=0,x,w;
for(x=l; x<=l+25; x++)
if(dp[str[x]])s[k++]=str[x];
k=0;
for(x=0; x<=25; x++)
{
int flag=1;
for(w=0; w<strlen(s); w++)
{
if((int)s[w]-'A'==x)
{
flag=0;
break;
}
}
if(flag)tem[k++]=(char)(x+'A');
}
k=0;
for(x=l; x<=l+25; x++)
if(str[x]=='?')str[x]=tem[k++];
for(i=0; i<strlen(str); i++)
if(str[i]=='?')str[i]='A';
puts(str);
}
}
return 0;
}
谢谢您的收看,希望我的思路能给你带来好处。