题目描述
有一个仅包含’a’和’b’两种字符的字符串s,长度为n,每次操作可以把一个字符做一次转换(把一个’a’设置为’b’,或者把一个’b’置成’a’);但是操作的次数有上限m,问在有限的操作数范围内,能够得到最大连续的相同字符的子串的长度是多少。
输入描述:
第一行两个整数 n , m (1<=m<=n<=50000),第二行为长度为n且只包含’a’和’b’的字符串s。
输出描述:
输出在操作次数不超过 m 的情况下,能够得到的 最大连续 全’a’子串或全’b’子串的长度。
示例1
输入
8 1 aabaabaa
输出
5
说明
把第一个 'b' 或者第二个 'b' 置成 'a',可得到长度为 5 的全 'a' 子串。
类似滑动窗口问题。
滑动窗口用deque,这里用queue,因为不需要和后面加入的数进行比较。
#include <algorithm>
#include <queue>
#include <iostream>
#include <string>
using namespace std;
int main()
{
int n, m;
cin >> n >> m;
string str;
cin >> str;
//存a ,b的位置
queue<int> qa;
queue<int> qb;
//需要变为a和变为b开始的位置
int starta = 0;
int startb = 0;
//需要变为a变为b的长度
int ansa = 0;
int ansb = 0;
for (int i = 0; i < str.size(); i++)
{
if (str[i] == 'a')
{
ansa = max(ansa, i - starta + 1);
if(qa.size() < m)
{
qa.push(i);
ansb = max(ansb, i - startb + 1);
}
else
{
startb = qa.front() + 1;
qa.pop();
qa.push(i);
}
}
else
{
ansb = max(ansb, i - startb + 1);
if (qb.size() < m)
{
qb.push(i);
ansa = max(ansa, i - starta + 1);
}
else
{
starta = qb.front() + 1;
qb.pop();
qb.push(i);
}
}
}
cout << max(ansa, ansb) << endl;
return 0;
}