带详细注释版代码

参考代码:https://blog.nowcoder.net/n/e3a4d16f5568484db99e3ef2a19c63b3?f=comment

#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;

int v[123];//z的ASCII码是122,这个数组用来比对某个字母出现的次数,来决定指针的左移还是右移
//由于ASCII字符的范围是0-255,这里建议使用256大小的数组覆盖所有可能的字符。
string s;
int main()
{
    cin >> s;
    int k=0;//k用来统计r和l之间(包括两者所指字符)出现的字母种数
    int l=0,r=-1,len=s.length();
   // int ans=0;//储存答案,ans初始化需要是一个较大的数,若为0,则不存在比这更短的子串(至少也是长度为26
    int ans = 1e6;
    while(l < len)
    {
        while(r < len-1 && k < 26)
        {///右指针右移
            v[s[++r]]++;
            if(v[s[r]]==1) ++k;
        }
        if(k == 26) ans=min(ans, r - l + 1);//min(ans, r - l + 1):比较当前找到的窗口长度与之前记录的最小长度 ans,取两者中的较小值。
        
        if(v[s[l]]==1)k--;
        v[s[l++]]--;///左指针右移
    }
    cout << ans << endl;
    return 0;
}