思路:
1.暴力:两层循环,确定一个位置往下遍历,直到完全含有26个字母,但一般都会超时;
2.(1)运用两个指针,慢指针不动,快指针往前走直到找到完全含有26个字母,满指针再往前走,直到不再完全包含全部字母后,记录长度,动态保存最短长度;
(2)当不再包含所有字母,快指针再往前走,直到完全找到;
关键:用bool记录字母的存在性无法注意重复性,用整型数组记录次数,sum记录26个字母(不重复);
代码如下:
#include <iostream>
#include<string>
#include<algorithm>
using namespace std;
int ch[27];//记录当前子段的个字母个数
int main()
{
int fast = 0, slow = 0, sum = 0, ans = 1000005;
string s;
cin >> s;
while (sum == 26 || fast < s.size())
{
if (sum != 26)//当不包含全部字母,快指针往前
{
if (!ch[s[fast] - 'a'])//当字母原子段不包含
sum++;
ch[s[fast++] - 'a']++;
}
else if (sum == 26)//当包含全部字母,慢指针往前
{
ch[s[slow] - 'a']--;
if (!ch[s[slow] - 'a'])//当其中一个字母不再包含
{
sum--;
ans = min(ans, fast - slow);
}
slow++;
}
}
cout << ans;
}