版权声明:如需转载,请注明出处: https://blog.csdn.net/qq_38701476/article/details/86583283
- 题意:第一行给你两个整数n和k ,n代表第二行给你的字符串(均小写)长度,在这个字符串内找长度为k的连续字符,求一共能够找多少个,并且每个字母最多只能属于一个
- 样例:
//input 输入的数据
8 2
aaacaabb
//output 输出的数据
2
//易知,找到的两个为前两个aa和c与b之间的aa,或者第二和第三个aa和c与b之间的aa。
- 解题思路:根据题意,我们能够知道答案必定是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];//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++;
}
//对26个字母取最大的那个值
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;
}