题意 : 这个人的键盘坏了,最多只能按n个键,给你一串字符串,问你找一个最长的字串,这个字串中包含的不同的字母不能超过n个。
思路 : 比赛的时候脑子没转过来,一直没模拟出来,都不知道怎么弄出来。。。。。就是我用的是队列,往队列里放就行,不过其实不用那么麻烦,直接往那个数组里放,然后指针移动的时候要注意别出错,基本上问题不大,我还因为数组开小了WA了一次。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
#include <iostream> #include <stdio.h> #include <string.h> #include <queue> using namespace std; char ch[1000010] ; int chh[501] ; int main() { int n ; while(~scanf("%d",&n)) { if(n == 0) break ; getchar() ; queue<int>q ; gets(ch) ; int len = strlen(ch) ; int k = 0,maxx = 0 ; memset(chh,0,sizeof(chh)) ; for(int i = 0 ; i < len ; i++) { int c = ch[i] ; q.push(c) ; if(!chh[c]) k++ ; chh[c] ++ ; while(k > n) { c = q.front() ; q.pop() ; if(chh[c] == 1) k-- ; chh[c]-- ; } c = q.size() ; maxx = max(maxx,c) ; } printf("%d\n",maxx) ; } return 0; }