思路:

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;
}