#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
int n,k,pos[20][200010],f[200010],cnt,len,l,r,mid,ans;
string A;
bool check(int x){
	for (int i=1;i<=k;i++){
		cnt=0;
		pos[i][n]=-1;
		for (int j=n-1;j>=0;j--){
			if (A[j]=='?'||A[j]=='a'+i-1)cnt++;
			else cnt=0;
			if (cnt>=x)pos[i][j]=j+x-1;
			else pos[i][j]=pos[i][j+1];
//			printf("%d %d %d:%d\n",x,i,j,pos[i][j]);
		}
	}
	len=(1<<k);
	f[0]=0;
	for (int i=1;i<len;i++){
		f[i]=1e9;
		for (int j=1;j<=k;j++){
			if ((i&(1<<(j-1)))&&f[i-(1<<(j-1))]!=1e9&&pos[j][f[i-(1<<(j-1))]]!=-1){
				f[i]=min(f[i],pos[j][f[i-(1<<(j-1))]]+1);
//				printf("f%d %d:%d %d\n",i,j,f[i],f[i-(1<<(j-1))]);
			}
		}
//		printf("f%d %d\n",i,f[i]);
	}
//	printf("%d %d???\n",x,f[len-1]);
	if (f[len-1]<=n)return true;
	else return false;
}
int main()
{
	scanf("%d%d",&n,&k);
	cin>>A;
	l=1;r=n;
	while (l<=r){
		mid=(l+r)>>1;
		if (check(mid)){
//			printf("OK???\n");
			ans=mid;l=mid+1;
		}else r=mid-1;
	}
	printf("%d\n",ans);
	return 0;
}