#include <cstdio>
#include <cstring>
#include <string>
#include <cmath>
#include <iostream>
#include <algorithm>
#include <vector>
#include <stack>
#include <sstream>
#include <map>
#include <set>
#include <queue>
#include <stdlib.h>
typedef long long ll;

using namespace std;

struct node
{
    int trace[200010];  //记录的是第in+1个字母'c'出现的位置
    int in=0;           //记录字母‘c‘出现的位置
} sum[30]; //一共26个小写字母,从0开始记

int main()
{
    int n, k;                //n表示字符串的个数,k表示要求包含k个相同字符
    cin >> n >> k;
    string s;
    cin >> s;

    /*
     以abeba为例,初始化
     i=0;
     c=a-a=0;
     sum[0].trace[1]=0,sum[0].in=2;

     i=1;
     c=b-a=1;
     sum[1].trace[1]=1,sum[1].in=2;

     i=2;
     c=e-a=4;
     sum[4].trace[1]=2,sum[4].in=2;

     i=3;
     c=b-a=1;
     sum[1].trace[2]=3,sum[1].in=3;

     i=4;
     c=a-a=0;
     sum[0].trace[2]=4,sum[0].in=3;

     最后的结果:
     对字母a:
     位置(i):          0 1 2 3 4 5 6 7 8 9
     sum[0].trace[i]:    0 4
     sum[0].in         最后是3

     对字母b:
     位置(i):          0 1 2 3 4 5 6 7 8 9
     sum[1].trace[i]:   1 3
     sum[1].in        最后是3

     对字母e:
     位置(i):          0 1 2 3 4 5 6 7 8 9
     sum[4].trace[i]:   2
     sum[4].in        最后是2

     */

    for (int i=0; i<s.length(); i++)
    {
        int c = s[i] - 'a';
        sum[c].trace[++sum[c].in] = i;
    }

    int ans = 10000010;      //ans表示包含k个相同字符的最小长度
    for (int i=0; i<26; i++) //记录a是0,所以记录字符是从0开始,25结束
    {
        for (int j=1; j<=sum[i].in-k+1; j++)
        {
            ans = min(ans, sum[i].trace[j+k-1]-sum[i].trace[j]+1);  //第j+k-1次出现的位置 - 第j次出现的位置(一共出现k次)
        }
    }

    if (ans !=  10000010) cout << ans << endl;
    else cout << "-1" << endl;
    return 0;
}