签到题,这题我们要求的是最小的覆盖所有不同点的长度
因此可以考虑双指针维护,我们先算出不同的个数,之后l和r都为1
当不够大的时候r向外,当相等的时候l往左,这样就可以遍历到所有能够达到要求的区间了
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int N=2e5+10; string s; map<char,int> m1; int main(){ ios::sync_with_stdio(false); int n; cin>>n; cin>>s; s=" "+s; int i; for(i=1;i<=n;i++){ m1[s[i]]++; } int ans=n; int num=m1.size(); m1.clear(); int now=0; int l=1,r=1; m1[s[l]]++; now=1; while(l<=n-num+1&&r<=n){ if(num==now){ ans=min(ans,r-l+1); m1[s[l]]--; if(!m1[s[l]]) now--; l++; } else{ r++; if(!m1[s[r]]){ now++; } m1[s[r]]++; } } cout<<ans<<endl; }