题意
给一个字符串,问包含26个小写字母的子串中,最短的长度是多少
分析
尺取法的模板题,子串是连续的,而且题目保证了一定存在这样的子串。那么取两个指针,后一个指针往后扫。一旦有满足题意的子串,就让前面的指针也往后扫,直到后面的指针扫不够了,在这个过程中,两个指针表示的就是当前的子串。指针每次变动一个我们就check一下是否包含26个字母,然后取最小的即可。
代码
#include <iostream>
#include <string>
#include <cstring>
#include <algorithm>
using namespace std;
int al[26];
bool check()
{
for (int i = 0; i < 26; i++)
if (al[i] == 0) return false;
return true;
}
int main()
{
ios::sync_with_stdio(false);
string a;
while (cin >> a)
{
memset(al, 0, sizeof(al));
int l = 0, r = 0, len = 100000000;
while (r <= a.size())
{
if (!check())
{
if (a[r] >= 'a'&&a[r] <= 'z') al[a[r] - 'a']++;
r++;
}
else
{
len = min(len, r - l);
if (a[l] >= 'a'&&a[l] <= 'z') al[a[l] - 'a']--;
l++;
}
}
cout << len << endl;
}
return 0;
}