有一个仅包含’a’和’b’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’a’设置为’b’,或者把一个’b’置成’a’);但是操作的次数有上限m,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。
/**
- 利用前缀和数组
- 例如:
- n=10,m=1,s=baabaabaab
- b a a b a a b a a b
- 0 1 2 3 4 5 6 7 8 9
- 将 b–>a
- b 的前缀和数组为
-
sums={ 0, 3, 6, 9, 10}//10 为字符串长度
- 计算长度分别为:
-
3 6-0-1=5 9-3-1=5 10-6-1=3
-
==>>max = max{ max, sums[i]-sum[i-m-1]-1}
*/
#include
#include
#include
using namespace std;
int main()
{
//while(true)
{
int iNum;//长度
int iTimes; //次数
std::string strString;
std::cin >> iNum >> iTimes;
std::cin >> strString;
int iIndex = 0;
std::vector<int> vAVector;
std::vector<int> vBVector;
for(; iIndex < iNum; iIndex ++)
{
if('a' == strString.at(iIndex))
{
vAVector.push_back(iIndex);
}
else if('b' == strString.at(iIndex))
{
vBVector.push_back(iIndex);
}
}
vAVector.push_back(iNum);
vBVector.push_back(iNum);
if(vAVector.size() <= iTimes || vBVector.size() <= iTimes)
{
std::cout << iNum;
return 0;
}
int iMax = vAVector[iTimes]; //处理首个字符
for(int i = iTimes + 1; i < vAVector.size(); i++)
{
int iTmp = vAVector[i] - vAVector[i - iTimes - 1] - 1;
if(iMax < iTmp)
iMax = iTmp;
}
for(int j = iTimes + 1; j < vBVector.size(); j++)
{
int iTmp = vBVector[j] - vBVector[j - iTimes - 1] - 1;
if(iMax < iTmp)
iMax = iTmp;
}
std::cout << iMax;
}
}