#include <bits/stdc++.h>
using namespace std;
#define fastIO ios_base::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL);
#define FF first
#define SS second
#define pb push_back
#define sz(x) (int)x.size()
#define oo 1e9
#define eps 1e-9
#define PI acos(-1.0)
#define lb lower_bound
#define ub upper_bound
#define all(a) (a).begin(), (a).end()
#define log2i(x) (64 - __builtin_clzll(1ll*(x)) - 1)
#define INF 0x7f7f7f7f
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int, int> ii;
typedef pair<ii, ii> Li;
const int N = 2e5+7, M=17;
const int MOD = 1e9+7;
const int MASK=(1<<M)-1;

int n, m, k, t;


int pos[N][M], mx[N][M], _dp[MASK+1];
char ch[N];

bool check(int mask, int mid) {
    for(int i=1;i<=mask;i++) _dp[i]=n+1;
    for(int i=n;i>0;i--) for(int j=0;j<m;j++)
        if(mx[i][j]>=mid) pos[i][j]=i+mid-1;
        else pos[i][j]=pos[i+1][j];
    for(int i=0;i<=mask;i++) for(int j=0;j<m;j++)
        if((i&(1<<j))&&_dp[i^(1<<j)]!=n+1)
            _dp[i]=min(_dp[i], pos[_dp[i^(1<<j)]+1][j]);
    return _dp[mask]<=n;
}

signed main() {
    //freopen("test.inp", "r", stdin);
    //freopen("test.out", "w", stdout);
    //fastIO;
    scanf("%d%d%s", &n, &m, &ch);
    int mask=(1<<m)-1; _dp[0]=0;
    for(int i=0;i<m;i++) mx[n+1][i]=0, pos[n+1][i]=n+1;
    for(int i=n;i>0;i--) for(int j=0;j<m;j++)
        if(ch[i-1]!='?'&&ch[i-1]-'a'!=j) mx[i][j]=0;
        else mx[i][j]=mx[i+1][j]+1;
    int l=0, r=n/m, mid, ans=0;
    while(l<=r) {
        mid=(l+r)/2;
        if(check(mask, mid)) l=mid+1, ans=mid;
        else r=mid-1;
    }
    printf("%d", ans);
    return 0;
}
/* stuff you should look for
    - int overflow, array   bounds
    - special cases (n=1?)
    - do smth instead of do nothing and stay organized
    - WRITE STUFF DOWN
    - DONT JUST STICK ON ONE APPROACH
*/
