牛客 都说小镇的切糕贵(双指针)

签到题,这题我们要求的是最小的覆盖所有不同点的长度

因此可以考虑双指针维护,我们先算出不同的个数,之后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;
}
View Code
原文地址:https://www.cnblogs.com/ctyakwf/p/12987696.html