题目链接:点击这里
贪心:最终的目的是得到连续相同子串,因此每次变换的目标一定是“比上一次变换得到的子串更长”,所以最终操作是连续的 变 或者 变
对于 变 的情况,可以分别统计每个 的前缀 和后缀 的位置(第一个 的前缀为 ,最后一个1的后缀为 ),那么 次操作,即变换连续 个1,最终的字符串长度就是第 个 的前缀 到第 个后缀 之间的距离。
对于 变 的情况同理。
#include<bits/stdc++.h>
using namespace std;
string s;
vector<int> v0, v1; //v0存字符'0'的坐标位置,v1存字符'1'的坐标位置
int main()
{
int n, k, i, j;
cin>>n>>k;
cin>>s;
v0.push_back(-1);
v1.push_back(-1);
for(i=0;i<n;i++)
{
if(s[i]=='0') v0.push_back(i);
else v1.push_back(i);
}
v0.push_back(n);
v1.push_back(n);
int ma = 0;
if(v0.size()-2<=k) //若'0'的个数比k小,则可全修改为'1'
ma = n;
else
{
for(i = 1, j = k; j < v0.size()-1; i++, j++)
{
ma = max(ma, v0[j+1]-v0[i-1]-1); //连续的k的'0'置'1'
}
}
if(v1.size()-2<=k) //若'1'的个数比k小,则可全修改为'0'
ma = n;
else
{
for(i = 1, j = k; j < v1.size()-1; i++, j++)
{
ma = max(ma, v1[j+1]-v1[i-1]-1); //连续的k的'1'置'0'
}
}
cout<<ma;
}