NC18386 字符串

字符串

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

题目大意:给你个全部小写英文字母的字符串,问你子串中包含26个英文小写字母的最短子串是多少
思路:直接尺取法,一开始右指针一直往右移动直到子串符合要求,符合要求后左指针再向右移动以去掉重复字母得到子串的长度,之后再重复流程,利用一个变量储存最小长度即可
代码如下:

#include <iostream>
#include <string.h>
#include <cstdio>
#include <map>
using namespace std;
char s[1000010];
int c[26]= {0};//记录每个小写字母的出现次数
int main()
{
    cin>>s;
    int cnt=0;//记录出现了多少种英文字母的变量
    int ans=10000000;
    int n=0;
    int i=0;//i为左边界,n为右边界
    int len=strlen(s);
    //  cout<<'z'-'a'<<endl;
    while(i<len)
    {
        while(n<len&&cnt<26)//防止n越界
        {
            if(c[s[n]-'a']==0)
                cnt++;
            c[s[n++]-'a']++;
        }
        if(n-i<ans&&cnt==26)ans=n-i;
        if(c[s[i]-'a']==1)
            cnt--;
        c[s[i++]-'a']--;
    }
    cout<<ans;
    return 0;
}
全部评论

相关推荐

积极的小学生不要香菜:你才沟通多少,没500不要说难
点赞 评论 收藏
分享
自学java狠狠赚一...:骗你点star的,港卵公司,记得把star收回去
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
07-15 17:24
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

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