思路:
初始第一遍确定顺序,之后从前向后一次缩减范围。
#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
typedef double db;
const int maxn = 100005;
char a[maxn];
int table[105];
int main()
{
cin>>a;
int res=0;
int i;
int alp=0;
for(i=0;a[i];i++)
{
if(table[a[i]]==0)
{
alp++;
table[a[i]]=1;
}
else
table[a[i]]++;
if(alp==26)
{
res=i+1;
break;
}
}
if(res==0)
cout<<"No Solution"<<endl;
else
{
int fir=0;
int pos=0;
for( i;a[i];i++)
{
if(fir)
table[a[i]]++;
else
fir=1;
while(pos<=i&&table[a[pos]]!=1)
table[a[pos]]--,pos++;
int tmp=i-pos +1;
res=min(res,tmp);
}
cout<<res<<endl;
}
}