#include<bits/stdc++.h>
#define f first
#define s second
using namespace std;
const int N=2e5+5,mod=1e9+7;
int t,aft[N][20],en[N][20],f[N],cnt[N][20],n,k,dp[N];
string s;
bool check(int x) {
	int cur = 0;
	for(int i=n;i>=1;i--) {
		for(int j=0;j<k;j++) {
			aft[i][j] = aft[i+1][j];
			if(en[i][j] - i + 1>= x) aft[i][j] = i;
		}

	}
	for(int i=1;i<(1<<k);i++){
		dp[i] = N;
	}
	dp[0] = 1;
	for(int i=1;i<(1<<k);i++){
		for(int j=0;j<k;j++){
			if(i & (1<<j)) {
				if(dp[i^(1<<j)] <= n)
				dp[i] = min(dp[i],aft[dp[i^(1<<j)]][j] + x);
			}
		}
	} 
	if(dp[(1<<k)-1]<=n+1) return 1;
	return 0;
}
 int main(){
	cin>>n>>k;
	cin>>s;
	s='#'+s+'?';
	for(int i=1;i<=n;i++) {
		if(s[i]!='?') cnt[i][s[i]-'a']++,f[i]++;
		f[i] += f[i-1];
		for(int j=0;j<k;j++) cnt[i][j] += cnt[i-1][j];
	}
	for(int i=1;i<=n;i++){
		
		for(int j=0;j<k;j++) {
			en[i][j] = 0;
			int l = i, r = n;
			while(l<=r){
				int mid = (l+r)/2;
				if(cnt[mid][j]-cnt[i-1][j] ==f[mid]-f[i-1]) {
					en[i][j] = mid;
					l = mid + 1;
				}
				else r = mid - 1;
			}
		}
	}
	for(int i=0;i<k;i++) aft[n+1][i] = N;
	int l = 1, r = n/k, ans = 0;
	while(l<=r){
		int mid = (l+r)/2;
		if(check(mid)) {
			l = mid + 1;
			ans = mid;
		}
		else r = mid - 1;
	}
	cout<<ans;
}
