#include "bits/stdc++.h"
using namespace std; 

#ifdef LOCAL
    #include "debug.h"
    #define input freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);
#else
    #define debug(...) 4
    #define input 4
#endif
using ll = long long;
// const int mod = 998244353;
const int mod = 1e9 + 7;
const int N = 2e5 + 5;

int pref[N][18];
int next_possible[N][18];
int last[18];
int dp[1 << 18];
signed main() {
    input;
    cin.tie(nullptr) -> sync_with_stdio(false);
    int tc = 1;


    // cin >> tc;
    while(tc--) {
        int n, k;
        cin >> n >> k;
        string s;
        cin >> s;

        auto check = [&] (int mid) {
            for(int i = 0; i < n + 2; i++) {
                for(int j = 0; j < k; j++) {
                    last[j] = k;
                    pref[i][j] = 0;
                    next_possible[i][j] = n + 1;
                }
            }
            for(int i = 0; i < n; i++) {
                for(int j = 0; j < k; j++) {
                    if(i) {
                        pref[i][j] = pref[i - 1][j];
                    }
                    if(s[i] == '?' || s[i] == char('a' + j))
                        pref[i][j]++;
                }
            }
            for(int i = n - 1; i >= 0; i--) {
                for(int j = 0; j < k; j++) {
                    next_possible[i][j] = next_possible[i + 1][j];
                    if(i + mid <= n and pref[i + mid - 1][j] - (i > 0 ? pref[i - 1][j] : 0) == mid) {
                        next_possible[i][j] = i;
                    }
                }
            }

            for(int i = 0; i < (1 << k); i++)
                dp[i] = n + 1;
            dp[0] = 0;
            for(int mask = 0; mask < (1 << k); mask++) {
                if(dp[mask] >= n + 1)
                    continue;
                for(int i = 0; i < k; i++) {
                    if(mask & (1 << i))
                        continue;
                    if(next_possible[dp[mask]][i] >= n + 1)
                        continue;
                    dp[mask | (1 << i)] = min(dp[mask | (1 << i)], next_possible[dp[mask]][i] + mid);
                }


            }
            return (dp[(1 << k) - 1] <= n);
        };
        int l = 0, r = 1 + n / k;
        while(l + 1 < r) {
            int mid = (l + r) / 2;
            if(check(mid))
                l = mid;
            else
                r = mid; 
        }
        cout << l << '\n';
    }
    return 0;


}   


