字符串( NC18386)

字符串

https://ac.nowcoder.com/acm/problem/18386

二分做法

一共26个字符,对于每个字符将他们的位置都记录下来
然后从前往后遍历字符串,对于每个字符,二分寻找其他25个字符大于该位置且离该位置最远的位置是多少,最远的位置减当前位置即是一次满足条件的子串的长度,最后找出最小的长度即可。

#include <bits/stdc++.h>
#define ll long long
using namespace std;

char s[1000005];
int pos[30][1000006];
int c[30],op;
int main()
{
    scanf("%s",s);
    int n=strlen(s);
    for(int i=0;i<n;i++)
    {
        op=s[i]-'a';
        pos[op][c[op]++]=i;
    }
    int ans=999999999,flag=1,w,dis;
    for(int i=0;i<n;i++)
    {
        op=s[i]-'a';
        dis=-1;
        for(int j=0;j<26;j++)
        {
            if(j==op){continue;}
            w=upper_bound(pos[j],pos[j]+c[j],i)-pos[j];
            if(w==c[j]){flag=0;break;}
            dis=max(pos[j][w],dis);
        }
        if(flag==0){break;}
        ans=min(ans,dis-i+1);
    }
    printf("%d\n",ans);
    return 0;
}
全部评论

相关推荐

LazyBreeze:项目尽量体现你对技术的理解和深度,不是说把中间件用一下就完事了,你项目里面提到集群和分布式,你真在服务器上部署过吗,感觉太假了,第二个项目说自己用了微服务的什么组件,只是用了没有自己的思考,很难让面试官注意到你的简历。针对某几个技术点自己多思考一下,考虑一下有没有别的替代方案,可以写一下,即使没有真的实现
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务