很烦,听说是尺取法。
听说就是先找到一个符合的状态,然后再缩小范围,然后继续搜索符合的状态。直到搜索完整个数据,找出最小区间。
#include <stdio.h>
#include <string.h>
#define MAXN 100100
#define INF 100101
#define MIN(a,b) a>b?b:a
int a[26],b[26];
char s[MAXN];
int main()
{
gets(s);
int len,min=INF,top=0,tou=0,cnt=0;
len=strlen(s);
while(top<len)
{
while(top<len&&cnt<26)
{
if(!a[s[top]-'A'])
{
cnt++;
}
a[s[top]-'A']++;
top++;
if(cnt==26)
min=MIN(min,top-tou);
}
while(tou<len&&cnt==26)
{
if(!(a[s[tou]-'A']-1))
{
cnt--;
}
a[s[tou]-'A']--;
tou++;
if(cnt==26)
min=MIN(min,top-tou);
}
}
if(min!=INF)
printf("%d\n",min );
else
printf("%s\n","No Solution" );
return 0;
}