Codeforces 701C They Are Everywhere(尺取/双指针)

题目链接

题意

有一排临街的房子,相邻房子之间可以直接移动到,只能选择一个地方从街上进入房子里,也只能出来一次,问找到所有种类 Pokemon的最少要访问几个房子

思路

很明显就是要找出一个包含所有种类字符的最短的子区间,直接尺取扫一遍,记录一下最小区间长度就行了,很标准的尺取法。

代码

#include 

using namespace std;
string str;
map<char,int> M;
int main(){
    int n;
    cin >>n;
    cin >> str;
    for(int i = 0 ; i < n ; i ++){
        M[str[i]] = 1;
    }
    int num = M.size();
    M.clear();
    int cnt = 1;
    int l = 0 ,r = 0;
    M[str[0]] = 1;
    int ans = 1e9;
    while(1){
        if(r >= n) break;
        while(cnt < num){
            r++;
            if(r >= n)break;
            if(!M[str[r]]){
                cnt++;
            }
            M[str[r]]++;
        }
        while(cnt >= num){
            ans = min(ans,r-l+1);
            M[str[l]]--;
            if(!M[str[l]]){
                cnt--;
            }
            l++;
        }
    }
    printf("%d",ans);
}

你可能感兴趣的:(题解)