这个题比较好的解决办法,我觉得还是map,map的size可以很快的知道我们选了几个字母,而且可以作为计数器,知道每一个字母出现了多少次, erase函数可以清除掉一个元素。
所以,定义两个指针L和R,当选择的数够了sum个以后,我们移动L指针,开始删除字母,直到不满足为止,然后移动R指针,看有没有其他的满足答案,并及时更新答案。
代码及注释如下:
ps:被这个题给虐了……(真是有愧于队友赐我的map小王子的称号……)
#include<iostream> #include<cstdio> #include<map> #include<cstring> using namespace std; #define N 100010 #define INF 99999999 map<char,int>mp; char a[N]; int sum,n; int main() { int ans = INF; cin>>n>>a; sum = 0; mp.clear(); for(int i = 0; i < n; i++) { if(!mp[a[i]]) { sum++; mp[a[i]] = 1; } } // cout<<"sum = "<<sum<<endl; mp.clear(); int l = 0,r = 0; while(r < n) { mp[a[r]]++; while(l <= r && mp.size()==sum)///直到满足条件,移动L指针 { mp[a[l]]--; ans = min(ans,r-l+1);///必须在上面更新 if(mp[a[l]] == 0) { mp.erase(a[l]);///及时删除 l++;///不要忘记移动指针,否则会出错 break; } else l++; } r++; } cout<<ans<<endl; return 0; }