Substring
题目大意:给了k和一个a—z字符串,求其中最长的子字符串中所有种类字符的个数都不超过k!
思路:一开始暴力TLE!也没想过会对,接下来用双指针,从1开始加入,采用map判断字符是否超过k,如果重复了,删除前面字符串知道不在重复,然后再加入,遍历完一遍后取最大值!
#include<bits/stdc++.h>
using namespace std;
int main()
{
int k;
string s;
while(cin >> k >> s){//
map<char,int>ma;//存区间内有的数字
int res=0;
//代码优化过,多理解下,还是很巧妙的!!
for(int l=0,r=0;l<s.size();l++){//双指针
while(ma[s[r]]<k && r<s.size() && l<=r){//当新加的满足<k,继续
ma[s[r]]++;
r++;
}
res=max(res,r-l+1);//r-l+1是长度
ma[s[l]]--;//减去最开头的数
}
cout << res-1 << endl;
}
}