题目链接:https://ac.nowcoder.com/acm/contest/3002/H

显然操作要么全1变0,要么全0变1。
尺取法:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn=2e5+5;
char q[maxn];
int main()
{
int n,k;
scanf("%d%d",&n,&k);
scanf("%s",q+1);
int ans1=0;
int ans2=0;
int num[2];
memset(num,0,sizeof(num));
for(int i=1,j=1;i<=n;i++) ///1 ->0
{
if(q[i]=='0')
{
num[0]++;
}
while(i-j+1-num[0]>k) ///当子串中1的个数大于可修改的次数,则j向右移动
{
if(q[j]=='0') /// 易忽略
{
num[0]--;
}
j++;
}
ans1=max(ans1,i-j+1);
}
for(int i=1,j=1;i<=n;i++) /// 0->1
{
if(q[i]=='1')
{
num[1]++;
}
while(i-j+1-num[1]>k)
{
if(q[j]=='1')
{
num[1]--;
}
j++;
}
ans2=max(ans2,i-j+1);
}
int ans=max(ans1,ans2);
printf("%d\n",ans);
}
本文详细解析了滑动窗口算法在字符串操作问题中的应用,通过具体题目实例,展示了如何使用滑动窗口法来解决字符串中最大合法子串的寻找问题。文章通过两个循环遍历,分别针对将'1'变为'0'和将'0'变为'1'两种情况,利用滑动窗口找到在限定修改次数下最长的连续相同字符序列。

474

被折叠的 条评论
为什么被折叠?



