
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int n,k;string s;
int solve(int d){
	int lp[18][n+2];
	memset(lp,-1,sizeof(lp));
		for(int i=0;i<k;i++){
			int pr=0;
			for(int j=n-1;j>=0;j--){
				if(((s[j]-'a')==i) || s[j]=='?'){
					pr++;
					if(pr>=d){
						lp[i][j]=j;	
//						if(i==0 && d==5) cout<<j<<" ";		
					}
					else{
						lp[i][j]=lp[i][j+1];
					}
				}
				else{
					pr=0;
					lp[i][j]=lp[i][j+1];
				}
			}
		}
		
//		if(d==5){
//		for(int i=0;i<k;i++){
//			for(int j=0;j<n;j++)
//			cout<<lp[i][j]<<" ";
//			cout<<endl;
//		}
//	}
		vector<int>dp((1<<k),n+1);
		dp[0]=0;
		for(int i=0;i<(1<<k);i++){
			for(int j=0;j<k;j++){
				if(!(i&(1<<j))){
					int pref=dp[i];
					
					if(pref!=n+1){
						if(lp[j][pref]!=-1)
					dp[i|(1<<j)]=min(dp[i|(1<<j)],lp[j][pref]+d);
				else
				dp[i|(1<<j)]=min(dp[i|(1<<j)],n+1); 
				}
					else dp[i|(1<<j)]=min(dp[i|(1<<j)],n+1);
//					if(__builtin_popcount(i)==1)
//					cout<<dp[i|(1<<j)]<<"dfh ";
				}
			}
		}
		
		if(dp[(1<<k)-1]!=-1 && dp[(1<<k)-1]!=(n+1))
		return 1;
		else 
		return 0;
}
int main(){
	
		 cin>>n>>k;
		 cin>>s;
		 int l=1,r=n;
		 while(l<=r){
		 	int mid=(l+r)>>1;
		 	if(solve(mid))
		 	l=mid+1;
		 	else 
		 	r=mid-1;
		 }
		 cout<<r;
	
}