这个题是我从开局做到结尾都没做出来的题。。。。。
先上题目
链接: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'
首先贴第一串代码 这个参考jxy大佬的代码
#include<iostream>
#include<string>
#include<map>
using namespace std;
int main(void)
{
int n,k;
string std;
map<char,int> mp;
int ans=-1,l=0,cnt=0;
while(cin>>n>>k>>std)
{
for(int i=0;i<n;i++)
{
char c=std[i];
mp[c]++;
while(mp[c]==k)
{
if(ans==-1)
ans=i-l+1;
else
ans=min(i-l+1,ans);
mp[std[l]]--;
l++;
}
}
cout<<ans<<endl;
}
return 0;
}
关于map才看了一点点 只会一点基本的操作
稍微写下这个代码的思路 用map来计数 记录每一个字母的个数 当有一个字母先达到k个时 就记录这个的长度 一开始l在0 所以要往右边缩 把左侧缩到达到k个的字母这 不用担心会有问题 因为被缩去的字母若是和后面的达到了k也必然更长 这里的代码几乎和jxy大佬的代码一致 我是在看懂大佬的代码之后再自己写了一遍
还多少看了一点其他大佬的代码真的是牛皮。。。

京公网安备 11010502036488号