牛客寒假集训营第一场 补题
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”则不是它的子串。
她想截取一段连续子串,这个子串包含至少 个相同的某个字母。
她想知道,子串的长度最小值是多少?
注:所谓连续子串,指字符串删除头部和尾部的部分字符(也可以不删除)剩下的字符串。例如:对于字符串“arcaea”\mathit{“arcaea”}“arcaea”而言,“arc”\mathit{“arc”}“arc”、“rcae”\mathit“rcae”“rcae”都是其子串。而“car”\mathit“car”“car”、“aa”\mathit“aa”“aa”则不是它的子串。
输入描述:
第一行输入两个正整数
和
输入仅有一行,为一个长度为
的、仅由小写字母组成的字符串。
输出描述:
如果无论怎么取都无法满足条件,输出
。
否则输出一个正整数,为满足条件的子串长度最小值。
示例1
说明
选择“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 }