#include<bits/stdc++.h>
using namespace std;
const int N=200010;
const int K=20;
char S[N];
int n,k,fl;
int f[N],cnt[K],num[K];
int nxt[N][K];
bool check(int p)
{
	memset(nxt,0,sizeof(nxt));
	for(int i=0;i<k;i++)
	{
		int cnt=0;
		for(int j=n;j>=1;j--)
		{
			if(S[j]=='a'+i || S[j]=='?') cnt++;
			else cnt=0;
			if(cnt>=p) nxt[j][i]=j+p-1;
			else nxt[j][i]=nxt[j+1][i];
		}
	}
	int sta=(1<<k)-1;f[0]=0;
//	for(int i=1;i<=sta;i++) f[i]=n+1;
	for(int s=1;s<=sta;s++)
	{
		f[s]=n+1;
//		if(f[s]==n+1) continue;
		for(int i=0;i<k;i++)
			if((s>>i)&1 && f[s-(1<<i)]!=n+1 && nxt[f[s-(1<<i)]+1][i]) f[s]=min(f[s],nxt[f[s-(1<<i)]+1][i]);
	}
//	cout<<f[sta]<<endl;
	return f[sta]<=n;
}
int main()
{
	scanf("%d%d",&n,&k);
	scanf("%s",S+1);
	if(n==1 && k==1 && S[1]=='?') {puts("1");return 0;}
	for(int i=1;i<=n;i++)
		if(S[i]=='?') fl=1;
	if(fl==0)
	{
		int lst=k,minn=INT_MAX;
		for(int i=n;i>=1;i--)
		{
			if(lst==k || S[i]-'a'!=lst)
			{
				if(lst!=k) cnt[lst]=max(cnt[lst],num[lst]),num[lst]=0;
				lst=S[i]-'a';
				num[lst]++;
			}
			else
			{
				num[lst]++;
				for(int j=0;j<k;j++)
				{
					if(j==lst) continue;
					cnt[j]=max(cnt[j],num[j]);
					num[j]=0;
				}
			}
		}
		cnt[lst]=max(cnt[lst],num[lst]);
		for(int i=0;i<k;i++) minn=min(minn,cnt[i]);
		printf("%d\n",minn);
		return 0;
	}
	int l=1,r=n/k+1,mid,ans=0;
	while(l<=r)
	{
//		cout<<l<<" "<<r<<" "<<((l+r)>>1)<<endl;
		mid=(l+r)>>1;
		if(check(mid)) l=mid+1,ans=mid;
		else r=mid-1;
	}
	printf("%d\n",ans);
	return 0;
}