#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<vector>
using namespace std;
int n,k;
string s;
bool check(int d)
{
    vector<int>lst(k,n);
	vector<vector<int> >pos(n+1, vector<int>(k, n + 1));
    for(int i=n-1;i>=0;i--)
    {
        // printf("%d\n",i);
        if(s[i]!='?') lst[s[i]-'a']=i;
        int cur=n;
        for(int j=0;j<k;j++)
        {
            pos[i][j]=(i+d<=cur?i+d:pos[i+1][j]);
            cur=min(cur,lst[j]);
        }
        cur=n;
        for(int j=k-1;j>=0;j--)
        {
            if(i+d>cur) pos[i][j]=pos[i+1][j];
            cur=min(cur,lst[j]);
        }
    }
    vector<int> dp(1<<k,n+1);
    dp[0]=0;
    // for(int j=0;j<k;j++)
    // {
    //     for(int i=1;i<=n;i++) printf("%d ",pos[i][j]);
    //     printf("\n");
    // }
    for(int mask=0;mask<(1<<k);mask++)
    {
        if(dp[mask]<n+1)
        {
            for(int i=0;i<k;i++)
            {
                // printf("    %d %d\n",mask,i);
                if(!((mask>>i)&1))
                {
                    // printf("%d\n",mask|(1<<i));
                    dp[mask|(1<<i)]=min(dp[mask|(1<<i)],pos[dp[mask]][i]);

                    // printf("        %d %d\n",mask|(1<<i),dp[mask|(1<<i)]);
                }
            }
        }
    }
    //  printf("    %d %d\n",d,dp[(1<<k)-1]);
    return dp[(1<<k)-1]<=n;
}
int main()
{
    scanf("%d%d",&n,&k);
    cin>>s;
    int l=1,r=n,mid=0;
    int ans=0;
    while(l<=r)
    {
        // printf("%d %d\n",l,r);
        mid=(l+r)>>1;
        if(check(mid))
        {
            ans=mid;
            l=mid+1;
        }
        else r=mid-1;
    }
    printf("%d",ans);
    return 0;
}