给定一个数组的序列,求满足数组中元素个数约束的最短子串. 一个头,一个尾,查找。复杂度O(N*K) #include <stdio.h> #define MAX 0xfffffff int c[400005]; int k[2050][2]; int num[2050]; int N,K; int judge() { int i; for(i=1;i<=K;i++) if(num[i] < k[i][0] || num[i]>k[i][1]) return 0; return 1; } int main() { int ans; int i,j,end,all; while(scanf("%d%d",&N,&K)!=EOF) { all = 0; for(i=0;i<N;i++) scanf("%d",&c[i]); for(i=1;i<=K;i++) { scanf("%d%d",&k[i][0],&k[i][1]); num[i]=0; all+=k[i][0]; } ans = MAX; end = N-all; int con_flag=1; for(j=i=0;con_flag && i<=end;) { con_flag = 0; for(;j<N;j++) { num[ c[j] ]++; if(num[ c[j] ] > k[ c[j] ][1]) { for(;i<=end;i++) { num[ c[i] ]--; if(c[i]==c[j]) { i++; break; } } con_flag = 1; num[c[j]]--; break; } if(judge()) { if( ans>(j-i+1) ) ans = j-i+1; num[ c[i] ]--; i++; con_flag=1; num[c[j]]--; break; } } } if(ans!=MAX) printf("%d/n",ans); else printf("-1/n"); } return 0; }