带详细注释版代码
参考代码: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;
}