题目链接:牛客算法寒假一H
题意: 给出一个只包含01的字符串,长度为n,可以有k次操作,使0变为1或1变为0,然后让输出只包含0或1的串的最长长度。
想法: 说一个简单的想法,记录0的下标和1的下标,可以消除k个阻隔,也就是 所有的间隔有k个的下标之差的最大值就是答案。(上代码可能好理解一些)
#include<bits/stdc++.h>
#include<vector>
using namespace std;
vector<int >dis[2];
int main(){
int n,k;
scanf("%d%d",&n,&k);
char s[200500];
scanf("%s",s);
dis[0].push_back(0);
dis[1].push_back(0);
for(int i=0;i<n;i++){
dis[s[i]-'0'].push_back(i+1);
}
dis[0].push_back(n+1);
dis[1].push_back(n+1); //处理边界
int ans=k;
for(int i=0;i<(int )dis[0].size()-k-1;i++){ //找出1的最大长度
ans=max(ans,dis[0][i+k+1]-dis[0][i]-1);
}
for(int i=0;i<(int )dis[1].size()-k-1;i++){ //找出0的最大长度
ans=max(ans,dis[1][i+k+1]-dis[1][i]-1);
}
printf("%d\n",ans);
}