const arr = readline().split(" ");
const inputStr = readline();
const n = parseInt(arr[0]);
const m = parseInt(arr[1]);
//将a|b所在坐标记录为a,b两个数组,此处我为了自己看着方便是以1开始的
let arrA = [],arrB = [];
let resultLen = 0;
for(let i = 0;i < inputStr.length;i++){
    if(inputStr[i] == "a"){
        arrA.push(i + 1);
    }else{
        arrB.push(i + 1);
    }
}
const lenA = arrA.length,lenB = arrB.length;
if(lenA <= m || lenB <= m){//a或b的数目小与等于操作次数,肯定是总长度了
    resultLen = n;
}
// a,b 都超过 m 时,如果将a 换成 b,从第i个a 开始换,那么 长度为 arrA[i-1] 到 arrA[i + m]的差值 -1
// 边界情况  m + 1 = arrA.length,最长的话就是n - arrA[0] 或者 arrA[m] - 1 
let resultA = getResult(n,m,arrA),resultB = getResult(n,m,arrB);
resultA > resultB ? print(resultA) : print(resultB);


function getResult(n,m,arr){
    if(m + 1 == arr.length){
        return n - arr[0] > arr[m] - 1 ? n - arr[0] : arr[m] - 1;
    }
    let result = 0;
    for(let i = 1;i <= arr.length - m;i++){
                //比较一下每次的值省的以后再去比对,其实可以增加一个参数arrB,直接来计算更新result,但是刚开始为了写完,没注意这些,应该会更节约一些吧
        result = arr[i + m] - arr[i - 1] - 1 > result ? arr[i + m] - arr[i - 1] - 1 : result;
    }
    return result;
}