#pragma GCC optimization "O2"
#pragma GCC optimization "unroll-loop"
#pragma GCC target ("avx2")

#include <bits/stdc++.h>
#define ll long long
#define ld long double
#define fs first
#define sc second
using namespace std;
const ll N = 2e5 + 3;
const ll inf = 1e9 + 7;
typedef pair<ll,ll> LL;

string s;
ll n,k,lf[N][18],nxt[N][18],dp[2*N];

bool bit(ll x,ll i){
    return (x >> i) & 1;
}

bool chk(ll m){
    fill(dp,dp + N - 2,inf);
    for (ll now = 0;now < k;now++){
        ll j = 1;
        for (ll i = 1;i <= n;i++){
            j = max(j,i);
            while(j <= n&&j - max(i - 1,lf[j][now]) < m) j++;
            nxt[i][now] = j;
        }
    }
    dp[0] = 0;
    for (ll i = 1;i < (1 << k);i++){
        for (ll j = 0;j < k;j++){
            if (bit(i,j)){
                ll cur = (i ^ (1 << j));
                if (dp[cur] >= n) continue;
                dp[i] = min(dp[i],nxt[dp[cur] + 1][j]);
            }
        }
    }
    //cout<<dp[(1 << k) - 1]; exit(0);
    return dp[(1 << k) - 1] <= n;
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0), cout.tie(0);
    #define task "tst"
    if (fopen(task".inp", "r")){
        freopen(task".inp", "r", stdin);
        //freopen(task".out", "w", stdout);
    }
    cin>>n>>k>>s; s = " " + s;
    for (ll i = 0;i < k;i++){
        char now = i + 'a'; ll l = n;
        for (ll j = n;j;j--){
            l = min(l,j);
            while(l > 0 && (s[l] == now || s[l] == '?')) l--;
            lf[j][i] = l;
        }
    }
    ll l,m,h; //cout<<chk(0); return 0;
    l = 1; h = n/k;
    while(l <= h){
        m = (l + h)/2;
        if (chk(m)) l = m + 1;
        else h = m - 1;
    }
    cout<<h;
}
