题目考点:尺取法(双指针)
题目大意:给定一个字符串,问集齐26个字母所需要的最短区间是多长。
题目分析:右指针字符串,当26个字母集齐之后移动左边界,维护最短长度即可;
代码:

#include<iostream>
#include<algorithm>
#include<cstring>

using namespace std;

const int N = 26, M = 1000010;
int n, ans = M, ch[N];
string s1;

bool jud()  //判断26个字符是否集齐
{
    for(int i = 0; i < 26; i++)
        if(!ch[i]) return false;
    return true;
}

int main()
{
    cin>>s1;

    int len = s1.length();
    for(int l = 0, r = 0; r < len; r++)
    {
        ch[s1[r] - 'a'] ++ ;
        while(jud())   //如果集齐26个字母,维护最小值,移动左边界
        {
            ch[s1[l] - 'a']--;
            ans = min(ans, r - l + 1);
            l++;
        }
    }

    cout<<ans;
    return 0;
}