题目:
代码:
#include<set>
#include<map>
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n,ans;
set<int> s;
map<int,int> m;
string a;
/*主要是得心细 仔细模拟
尺取法先移动右端点到一个符合条件的情况 然后尝试向前移动左端点
如此反复直到右端点移动到头
*/
int main(){
ios_base::sync_with_stdio(false);
cin>>n>>a;
for(int i=0;a[i]!='\0';i++) s.insert(a[i]-'A');
int num=s.size();
ans=n;
int L=0,R=0,cnt=0;
while(R<n){
while(R<n&&cnt<num){///只要区间尚未覆盖所有元素 右端点右移
if(!m[a[R]]) cnt++;///覆盖新元素
m[a[R++]]++;///覆盖新元素 右端点右移
}
while(m[a[L]]>1) m[a[L++]]--;///尝试向前移动左端点 同时改变区间覆盖情况
if(cnt==num){///第一个循环有可能出现R=n但还没覆盖满就退出了的情况
ans=min(ans,R-L);
//cout<<L<<" "<<R<<endl;
m[a[L++]]--;
cnt--;
}
}
printf("%d\n",ans);
return 0;
}