这里哪里错了
  • 板块灌水区
  • 楼主LittleWin
  • 当前回复11
  • 已保存回复11
  • 发布时间2023/6/9 15:52
  • 上次更新2023/10/23 13:35:29
查看原帖
这里哪里错了
933247
LittleWin楼主2023/6/9 15:52

我的题解错了,帮忙看看

错误原因:很遗憾,您上传的题解 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;
}

谢谢您的收看,希望我的思路能给你带来好处。

2023/6/9 15:52
加载中...