链接:https://ac.nowcoder.com/acm/contest/3002/G
来源:牛客网
题目描述
eli拿到了一个仅由小写字母组成的字符串。
她想截取一段连续子串,这个子串包含至少K 个相同的某个字母。
她想知道,子串的长度最小值是多少?
注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串“arcaea”而言,“arc”、“rcae”都是其子串。而“car”、“aa”则不是它的子串。
输入描述:
第一行输入两个正整数n和k
输入仅有一行,为一个长度为n的、仅由小写字母组成的字符串。
输出描述:
如果无论怎么取都无法满足条件,输出-1。
否则输出一个正整数,为满足条件的子串长度最小值。
示例1
输入
5 2
abeba
输出
3
说明
选择“beb”子串,长度为3,其中包含相同的两个'b'
题解
使用vector d[26],按字母存入字符串的下标,
使用minn=min(minn,d[i][j+k-1]-d[i][j]),扫一遍就好。
代码
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
int n,k;
char x[200005];
vector<int> d[26];
int main()
{
cin>>n>>k;
scanf("%s",x);
for(int i=0;i<n;i++){
d[x[i]-'a'].push_back(i);
}
int minn=200005;
bool flag=false;
for(int i=0;i<26;i++){
if(d[i].size()<k)
continue;
else{
flag=true;
for(int j=0;j<d[i].size()-k+1;j++){
minn=min(minn,d[i][j+k-1]-d[i][j]);
}
}
}
if(flag)
cout<<minn+1<<endl;
else
cout<<"-1"<<endl;
return 0;
}