CCCherry

导航

牛客寒假集训营第一场 补题

 G-eli和字符串

https://ac.nowcoder.com/acm/contest/3002/G

题目描述

eli拿到了一个仅由小写字母组成的字符串。
她想截取一段连续子串,这个子串包含至少 个相同的某个字母
她想知道,子串的长度最小值是多少?
注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串“arcaea”\mathit{“arcaea”}arcaea”而言,“arc”\mathit{“arc”}arc”、“rcae”\mathit“rcae”rcae”都是其子串。而“car”\mathit“car”car”、“aa”\mathit“aa”aa”则不是它的子串。
 

输入描述:

第一行输入两个正整数 

输入仅有一行,为一个长度为
 的、仅由小写字母组成的字符串。
 

输出描述:

如果无论怎么取都无法满足条件,输出 

否则输出一个正整数,为满足条件的子串长度最小值。
 
示例1

输入

复制
5 2
abeba

输出

复制
3

说明

选择“beb”\mathit“beb”beb”子串,长度为3,其中包含相同的两个'b'
 1 #include <iostream>
 2 #include <string>
 3 #include <algorithm>
 4 using namespace std;
 5 int n,k,f,m[30][100000]={0},c[30]={0},w=0,j=0,ans=10000000;
 6 int main()
 7 {
 8     string s;
 9 
10     cin>>n>>k>>s;
11     for(int i=0;i<n;i++)
12     {
13         c[s[i]-'a']++;//统计各字母数量 
14         m[s[i]-'a'][c[s[i]-'a']]=i;//标记位置 
15     }
16     for(int i=0;i<27;i++)
17     {
18         if(c[i]>=k)
19         {
20             w=1;
21             for(int j=1;j<=c[i]-k+1;j++)
22             {
23                 ans=min(ans,m[i][k+j-1]-m[i][j]+1);
24             }
25                 
26         }
27     }
28     if(w==0) cout<<-1;
29     else cout<<ans;
30 }

 

 

posted on 2020-02-05 19:39  CCCherry  阅读(161)  评论(0编辑  收藏  举报