#include<bits/stdc++.h>
#define ll long long
#define pb push_back
#define INF 0x3f3f3f3f
#define LINF 0x3f3f3f3f3f3f3f3f
#define PI pair<int,int>
#define MP make_pair
#define fi first
#define se second
#define lson rt<<1,l,mid
#define rson rt<<1|1,mid+1,r
#define random(a,b) (mtrand()%(b-a+1)+a)
#define PLI pair<ll,int>
#define PL pair<ll,ll>
#define lc ch[x][0]
#define rc ch[x][1]
#define D(x) #x,x
#define FIO ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
void debug() {}
template<class T,class ...U> void debug(const T &head,const U &... tail)
{
    cerr<<head<<(sizeof...(tail)?" ":"\n"),debug(tail...);
}
const int mx=2e5+10;
const ll mod=998244353;
mt19937_64 mtrand(time(0));
int n,m,T;
string s;
int st[17][1<<17],num[17],cnt[233];
vector<int>vec[mx];
bool now[1<<17];
void run(int nst)
{
    if (!now[nst])
    {
        now[nst]=1;
        for (int i=0,j=nst;i<m;++i,j>>=1)
        {
            if (!(j&1))
            {
                st[i][num[i]++]=nst;
            }
        }
    }
}
bool solve(int mid)
{
    memset(now,0,sizeof(now));
    for (int i=0;i<m;++i) num[i]=cnt['a'+i]=0;
    for (int i=0;i<s.size();++i)
    {
        vec[i].clear();
        if (s[i]!='?') ++cnt[s[i]];
        if (i-mid>=0&&s[i-mid]!='?') --cnt[s[i-mid]];
        if (i-mid>=0)
        {
            for (int j:vec[i-mid]) run(j);
        }
        if (i+1>=mid)
        {
            if (i+1==mid) run(0);
            int tot=0,id=-1;
            for (int j=0;j<m;++j)
            {
                if (cnt['a'+j])
                {
                    id=j,++tot;
                }
            }
            if (tot==0)
            {
                for (int j=0;j<m;++j)
                {
                    for (int k=0;k<num[j];++k)
                    {
                        int nst=st[j][k]|(1<<j);
                        if (nst==(1<<m)-1) return true;
                        vec[i].pb(nst);
                    }
                    num[j]=0;
                }
            }
            else if (tot==1)
            {
                int j=id;
                for (int k=0;k<num[j];++k)
                {
                    int nst=st[j][k]|(1<<j);
                    if (nst==(1<<m)-1) return true;
                    vec[i].pb(nst);
                }
                num[j]=0;
            }
        }
    }
    return false;
}
int main()
{
    FIO;
    cin>>n>>m;
    cin>>s;
    int l=1,r=s.size()/m;
    while (l<=r)
    {
        int mid=l+r>>1;
        if (solve(mid)) l=mid+1;
        else r=mid-1;
    }
    cout<<r<<"\n";
}
