#include <iostream>
#include <cstdio>
#include <vector>
#include <queue>
#include <fstream>
#include <bitset>
#include <cassert>
#include <cstring>
#include <ctime>
#include <cmath>
#include <set>
#include <map>
#include <algorithm>
#define sec second
#define fir first
#define deb(...) deb_print(#__VA_ARGS__ , __VA_ARGS__);
using namespace std;
template <typename ...Args>
void deb_print(string s , Args&& ...arg){
    static const string limiter = "\n";
    cerr << s << " : ";
    cerr << (... , (cout << arg << ' ' , limiter));
}

using vi = vector<int>;
using vii = vector<vi>;
using pii = pair<int , int>;
using ll = long long;
using ld = long double;
const int MAX = 1e9 , MIN = - MAX , MOD = 1e9 + 7;
const ll MAX_LL = 1e18 , MIN_LL = -MAX_LL;
int n , k;
int max_len_mulai[200001][17] , nearest_idx[200001][17];
int last_mask_idx[1 << 17];
string s;

bool valid(int val){
    fill(nearest_idx[n] , nearest_idx[n] + k , -1);
    fill(last_mask_idx , last_mask_idx + (1 << k) , MAX);

    for (int i = n - 1  ; i >= 0 ; --i)
        for (int j = 0 ; j < k ; ++j){
            if (max_len_mulai[i][j] >= val)
                nearest_idx[i][j] = i;
            else
                nearest_idx[i][j] = nearest_idx[i + 1][j];
        }

    /*cerr << "nearest idx\n";
    for (int j = 0 ; j < k ; ++j)
        for (int i = 0 ; i < n ; ++i)
            cerr << nearest_idx[i][j] << " \n"[i == n - 1];
    cerr << endl;*/

    last_mask_idx[0] = 0;
    for (int i = 0 ; i < (1 << k) ; ++i)
        if (last_mask_idx[i] != MAX && last_mask_idx[i] < n){
            for (int j = 0 ; j < k ; ++j)
                if ((i & 1 << j) == 0 && nearest_idx[last_mask_idx[i]][j] != -1)
                    last_mask_idx[i | 1 << j] = min(last_mask_idx[i | 1 << j] , nearest_idx[last_mask_idx[i]][j] + val);
        }

    return last_mask_idx[(1 << k) - 1] != MAX;
}
int main(){
    cin >> n >> k >> s;
    if (n < k)
        return 0 * puts("0");

    for (int i = n - 1 ; i >= 0 ; --i){
        if (s[i] != '?')
            max_len_mulai[i][s[i] - 'a'] = max_len_mulai[i + 1][s[i] - 'a'] + 1;
        else
            for (int j = 0 ;  j < k ; ++j)
                max_len_mulai[i][j] = max_len_mulai[i + 1][j] + 1;
    }

    /*cerr << "max_len_mulai\n";
    for (int j = 0 ; j < k ; ++j)
        for (int i = 0 ; i < n ; ++i)
            cerr << max_len_mulai[i][j] << " \n"[i == n - 1];*/

    int l = 0 , r = n;
    while(l < r){
        int mid = (l + r >> 1) + (l + r & 1);
        //deb(mid);
        if (valid(mid))
            l = mid;
        else
            r = mid - 1;
    }
    cout << l  << endl;


}
