#include<bits/stdc++.h>

using namespace std;
#define forn(i, n) for(int i = 0; i < int(n); i++) 
#define f first
#define s second
#define pb push_back
typedef pair<int, int> pii;


void inppp(){
	freopen("in.txt", "r", stdin);
	freopen("out.txt", "w", stdout);
}
const int MAXN = 1e5 + 5;
const int inf = 1e9 + 7;

int n, k;
string s;

int check(int d) {

	vector<int> dp(1 << k, n + 1);
	vector<int> lst(k, n);
	vector<vector<int>> pos(n + 1, vector<int> (k, n + 1));


	for(int i = n - 1; i >= 0; i--) {
		if(s[i] != '?') {
			lst[s[i] - 'a'] = i;
		}

		int cur = n;

		forn(j, k) {
			pos[i][j] = i + d <= cur ? i + d : pos[i + 1][j];
			cur = min(cur, lst[j]);
		}

		cur = n;
		for(int j = k - 1; j >= 0; j--) {
			if(i + d > cur) pos[i][j] = pos[i + 1][j];
			cur = min(cur, lst[j]);
		}
	}

	dp[0] = 0;
	forn(msk, 1 << k) {
		if(dp[msk] < n + 1) {
			forn(i, k) {
				if(!((msk >> i) & 1)) {
					dp[msk | (1 << i)] = min(dp[msk | (1 << i)], pos[dp[msk]][i]);
				}
			}
		}
	}

	return dp[(1 << k) - 1] < n + 1;
}




void solve() {
	cin >> n >> k;
	cin >> s;
	int l = 0, r = n + 1;
	while(l + 1 < r) {
		int m = (l + r) / 2;
		if(check(m)) {
			l = m;
		}
		else {
			r = m;
		}
	}

	cout << l;

	/*int l = 1, r = n;
	int res = 0;
	while (l <= r){
		int m = (l + r) / 2;
		if (check(m)){
			res = m;
			l = m + 1;
		}
		else{
			r = m - 1;
		}
	}
	cout << res << endl;*/
}


int main() {
	//inppp();
	int t = 1;
	//cin >> t;
	while(t) {
		solve();
		t--;
	}
	return 0;
}