题目链接
有一排临街的房子,相邻房子之间可以直接移动到,只能选择一个地方从街上进入房子里,也只能出来一次,问找到所有种类 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);
}