#include <iostream>
#include <algorithm>
#include <vector>
using namespace std;

int n, k;
int arr[200005];
string s;
int dpArr[200005];
int amt[18];
vector<int> startPos[18];
int curRow;

int dp(int bit) {
	if (dpArr[bit] != -1) return dpArr[bit];
	if (bit == 0) return 0;
	dpArr[bit] = n + 1;
	for (int i = 0; i < k; ++i) {
		if ((bit >> i)%2) {
			int ans = dp(bit - (1 << i));
			if (ans > startPos[i][startPos[i].size() - 1]) continue;
			int l = 0;
			int r = startPos[i].size() - 1;
			while (l < r) {
				int mid = (l + r) / 2;
				if (startPos[i][mid] >= ans) r = mid;
				else l = mid+1;
			}
			dpArr[bit] = min(dpArr[bit], startPos[i][r] + (curRow));
		}
	}
	return dpArr[bit];
}

bool work(int x) {
	curRow = x;
	for (int i = 0; i < 200005; ++i) dpArr[i] = -1;
	for (int i = 0; i < 18; ++i) {
		amt[i] = 0;
		startPos[i].clear();
	}
	for (int i = 0; i < n; ++i) {
		if (arr[i] != -1) amt[arr[i]]++;
		if (i >= x) if (arr[i-x] != -1) amt[arr[i - x]]--;
		if (i >= x - 1) {
			int num = 0;
			for (int j = 0; j < k; ++j) if (amt[j] > 0) num++;
			if (num == 0) for (int j = 0; j < k; ++j) startPos[j].push_back(i - (x - 1));
			if (num == 1) for (int j = 0; j < k; ++j) if (amt[j] > 0) startPos[j].push_back(i - (x - 1));
		}
	}
	for (int i = 0; i < k; ++i) {
		if (startPos[i].size() == 0) return false;
	}
	/*cout << "START " << x << endl;
	for (int i = 0; i < k; ++i) {
		for (int x : startPos[i]) cout << x << " ";
		cout << endl;
	}*/
	if (dp((1 << k) - 1) <= n) return true;
	return false;
}

int main() {
	cin >> n >> k;
	cin >> s;
	for (int i = 0; i < n; ++i) {
		if (s[i] == '?') {
			arr[i] = -1;
		}
		else arr[i] = (s[i] - 'a');
	}
	int l = 0;
	int r = n;
	while (l < r) {
		int mid = (l + r+1) / 2;
		if (work(mid)) l = mid;
		else r = mid - 1;
	}
	cout << l << endl;
}