简单的尺取法……
先找到右边界 然后在已经有了所有字母后减小左边界……
不断优化最短区间就好了~
1 #include<stdio.h> 2 #include<string.h> 3 #define M(a,b) memset(a,b,sizeof(a)) 4 char a[200005]; 5 int zimu[205]; 6 int zimu1[205]; 7 bool in[205]; 8 int sum; 9 int main(){ 10 int n; 11 while(~scanf("%d",&n)){ 12 getchar(); 13 M(zimu,0); 14 M(in,false); 15 gets(a); 16 sum=0; 17 int minx=1000005; 18 for(int i=0;i<n;i++){ 19 if(!in[a[i]-'A']){ 20 in[a[i]-'A']=true; 21 sum++; 22 } 23 } 24 M(in,false); 25 int l=0,r=0,num=0; 26 while(r<n){ 27 zimu[a[r]-'A']++; 28 if(!in[a[r]-'A']){ 29 in[a[r]-'A']=true; 30 num++; 31 } 32 if(sum==num){ 33 while(true){ 34 if(zimu[a[l]-'A']==1) break; 35 else zimu[a[l]-'A']--; 36 l++; //在这里T了一发 37 } 38 if(r-l+1<minx) minx=r-l+1; 39 } 40 r++; 41 } 42 printf("%d ",minx); 43 } 44 return 0; 45 } 46 /* 47 48 3 49 AaA 50 7 51 bcAAcbc 52 6 53 aaBCCe 54 55 56 */