题目链接
- 题意:第一行给你两个整数n和k
(
1
≤
k
≤
n
≤
2
⋅
1
0
5
)
(1≤k≤n≤2⋅10^5)
(1≤k≤n≤2⋅105),n代表第二行给你的字符串(均小写)长度,在这个字符串内找长度为k的连续字符,求一共能够找多少个,并且每个字母最多只能属于一个
- 样例:
8 2
aaacaabb
2
- 解题思路:根据题意,我们能够知道答案必定是a到z之间的26个字母中的一个。因此我们用一个vector创建一个大小为26的数组,里面的值是每一段连续这个字母的时候长度是多少。最终答案为每个数组,把值除k取整的和,并在这26的数组取最大的那个值即可
- 代码如下:
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
typedef long long ll;
string s;
int n,k;
vector<int>G[26];
int main(){
cin>>n>>k>>s;s+="A";
int ans=0;
int h=1;char c=s[0];
for(int i=1;i<=n;i++){
if(s[i]!=c){
G[c-'a'].push_back(h);
h=1;c=s[i];
}else
h++;
}
for(int i=0;i<26;i++){
int h=0;
for(int j=0;j<G[i].size();j++){
h+=G[i][j]/k;
}
ans=max(ans,h);
}
cout<<ans<<endl;
return 0;
}