2020牛客寒假算法基础集训营1
题意:
eli拿到了一个仅由小写字母组成的字符串。
她想截取一段连续子串,这个子串包含至少k个相同的某个字母。
她想知道,子串的长度最小值是多少?
注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串
“
a
r
c
a
e
a
”
\mathit{“arcaea”}
“arcaea”而言,
“
a
r
c
”
\mathit{“arc”}
“arc”、
“
r
c
a
e
”
\mathit“rcae”
“rcae”都是其子串。而
“
c
a
r
”
\mathit“car”
“car”“、
“
a
a
”
\mathit“aa”
“aa”则不是它的子串。
思路:
把字符串放的vector中,每个代表该字母的在字符串中的所有位置,开个二维数组写也行,然后找满足题意的最小值即可,看代码应该能理解
代码:
#include <iostream>
#include <stdio.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <math.h>
#include <map>
#include <queue>
#include <set>
using namespace std;
typedef long long ll;
const int maxn=2e5+50;
const int inf=0x3f3f3f3f;
char ch[maxn];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
scanf("%s",ch);
vector<int>p[30];
for(int i=0;ch[i];i++){
p[ch[i]-'a'].push_back(i);
}
int mi=inf;
for(int i=0;i<26;i++){
for(int j=0;j<p[i].size();j++){
if(j+k-1>=p[i].size())break;//该字母往后面不够k个了
mi=min(mi,p[i][j+k-1]-p[i][j]+1);//k个该字符的长度
//cout<<mi<<endl;
}
}
if(mi==inf)printf("-1\n");
else printf("%d\n",mi);
return 0;
}