#include<bits/stdc++.h>
using namespace std;
using ll=long long;
const ll inf=1145141919810; // 初始化无穷大,用于记录最小长度的初始值
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); // 关闭同步,加速输入输出
ll n,k;
cin>>n>>k;
string s;
cin>>s;
// ********** 初始化算法核心变量 **********
// 哈希表:key=字符,value=该字符出现的所有下标(按出现顺序存储)
unordered_map<char,vector<ll>>m;
ll ans=inf; // 记录满足条件的子串最小长度,初始为无穷大
// ********** 核心:遍历字符串,维护每个字符的出现位置列表 **********
for(ll i=0;i<n;i++){
// 步骤1:将当前字符的下标i加入对应字符的位置列表
m[s[i]].emplace_back(i);
// 步骤2:如果当前字符的出现次数超过k,删除最早的下标(仅保留最近k个位置)
// 原因:我们需要的是「包含恰好k个该字符」的子串,保留最近k个位置才能得到最短子串
if(m[s[i]].size()>k){
m[s[i]].erase(m[s[i]].begin());
}
// 步骤3:当当前字符的出现次数恰好为k时,计算对应子串的长度
if(m[s[i]].size()==k){
// 子串的左边界是列表中第一个下标,右边界是列表中最后一个下标
// 子串长度 = 右边界 - 左边界 + 1(下标从0开始,+1是因为要包含两端)
ll t=m[s[i]].back()-m[s[i]].front()+1;
ans=min(ans,t); // 更新全局最小长度
}
}
// ********** 输出结果 **********
if(ans==inf)cout<<-1; // 若ans仍为无穷大,说明没有字符出现至少k次,输出-1
else cout<<ans; // 否则输出最小子串长度
return 0;
}