这个题是我从开局做到结尾都没做出来的题。。。。。
先上题目
链接: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大佬的代码一致 我是在看懂大佬的代码之后再自己写了一遍

还多少看了一点其他大佬的代码真的是牛皮。。。