#include<bits/stdc++.h>
using namespace std;
const int mxn=2e5+10,mxa=18;
char ch[mxn];
vector<int>all[mxa];
int dp[1<<mxa],n,k;
bool f(int x){
    if(x<=0)return true;
    for(int i=0;i<k;++i){
        all[i].clear();
        char c='a'+i;
        for(int j=1,cnt=0;j<=n;++j){
            if(j>x)cnt-=ch[j-x]==c||ch[j-x]=='?';
            cnt+=ch[j]==c||ch[j]=='?';
            if(cnt==x)all[i].push_back(j-x+1);
        }
    }
    const int u=1<<k;
    for(int mask=1;mask<u;++mask){
        dp[mask]=-1;
        for(int i=0;i<k;++i)if(mask>>i&1){
            int cmask = mask^(1<<i);
            if(dp[cmask]==-1)continue;
            auto it=lower_bound(all[i].begin(),all[i].end(),dp[cmask]);
            if(it!=all[i].end() && (dp[mask]==-1 || dp[mask]>*it+x))dp[mask]=*it+x;
        }
    }
    return dp[u-1]!=-1;
}
int main(){
    scanf("%d%d",&n,&k);
    scanf("%s",ch+1);
    int low=-1,high=2*n,mid;
    while(high-low>1){
        mid=(low+high)/2;
        if(f(mid))low=mid;
        else high=mid;
    }
    printf("%d\n",low);
}