01最大价值

题目

你有一个长度为 n 的 01 串S,你可以执行最多 m 次操作。
对于每次操作,你可以选择一个位置 i 满足 1≤i≤n,翻转这一位的值,0变成1,1变成0。
定义一个 01 串的价值为其中最长连续0的个数和最长连续1的个数的较大值,求S在经过最多m次操作后的最大价值。

输入描述:

 第一行一个整数 T ,表示接下来有 T 个样例。
首先输入n,m,表示S串的长度n和操作次数m,其中1≤n≤100000,0≤m≤1000;
接下来输入一个长度为n的字符串S。

输出描述:

一个整数,表示题面上描述的最大价值。

示例1

输入

2
5 1
00101
2 1
01

输出

4
2

说明

第一个串翻转第三个位置,00001的价值为4;第二个串翻转第一个位置,11的价值为2。

分析

尺取法
设置两个指针,两个指针都初始化在开始位置
第一个指针每往后移动一个位置,第二个指针都相应往后遍历一遍(每次从第一个指针的位置开始)

该题第一个指针(遍历)确定后,第二个指针每次从第一个指针开始处遍历到最远距离,它们的距离即为最大价值。

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);

		int t = cin.nextInt();
		while(t-- > 0){
			int n = cin.nextInt();
			int m = cin.nextInt();
			String s = cin.next();
			
			System.out.println(Math.max(getAns(s, m, '0'), getAns(s, m, '1')));
		}
		
		cin.close();
	}

	private static int getAns(String s, int k, char c) {
		int len = s.length();
		int l = 0;
		int r = 0;
		int ans = 0;
		while(l < len){
			int m = k;
			if(s.charAt(l) != c){
				if(m > 0){
					m --;
				}else{
					l ++;
					continue;
				}
			}
			
			r = l + 1;
			while(r < len){ //第二个指针找最大满足条件的位置
				if(s.charAt(r) != c){
					if(m <= 0){
						break;
					}
					m --;
				}
				r ++;
			}
			
			ans = Math.max(ans, r-l); //两指针距离即为当前最大价值
			l ++;
		}
		return ans;
	}
}

如有错误或不合理的地方,敬请指正~

加油|!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值