使用尺取法解决
#pragma warning(disable : 4996)
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cstdlib>
using namespace std;
char a[100100];
int flag[26];
int select()
{
int i;
for (i = 0; i < 26; i++)
if (flag[i] == 0)
break;
if (i >= 26)
return 1;
else
return 0;
}
int main(int argc, char **argv)
{
memset(a, 0, sizeof(a));
while (scanf("%s", a) != EOF)
{
for (int i = 0; i < 26; i++)
flag[i] = 0;
int l = 0, n = strlen(a), sum = n + 1;
if (n < 26)
printf("0\n");
else
{
for (int i = 0; i < 26; i++)
flag[a[i] - 97]++;
int p = select();
if (p == 1 && n == 26)
{
printf("26\n");
memset(a, 0, sizeof(a));
continue;
}
int r = 26;
for (int i = 26; i < n; i++)
{
p = select();
if (p == 0)
flag[a[r++] - 97]++;
while (select())
{
sum = min(r - l, sum);
flag[a[l++] - 97]--;
}
}
if (sum > n)
printf("0\n");
else
printf("%d\n", sum);
}
memset(a, 0, sizeof(a));
}
return 0;
}