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

题意:
给定一字符串s,找到其包含所有小写字母的最短子串。

分析:
枚举区间,首先想到尺取法。
尺取法:先初始化区间[0,-1],尺取移动右端点至区间[l,r]为合法区间,然后在满足条件的情况下不断向右移动左端点,缩小合法区间长度,更新ans最小值。尺取结束后答案即为ans。

代码:

#include <bits/stdc++.h>
using namespace std;
const int inf=0x3f3f3f3f;
char a[1000005];
int b[30];
int ok(){
    for(int i=0;i<26;i++){
        if(b[i]==0){
            return 0;
        }
    }
    return 1;
}
int main()
{
    scanf("%s",a);
    int len=strlen(a);
    int l=0,r=-1,ans=inf;
    for(int i=0;i<len;i++){
        r++;
        b[a[i]-'a']++;
        while(ok()){
            ans=min(ans,r-l+1);
            b[a[l]-'a']--;
            l++;
        }
    }
    printf("%d",ans);
}