1529. 最少的后缀翻转次数

地址:

力扣icon-default.png?t=M0H8https://leetcode-cn.com/problems/minimum-suffix-flips/

题目:

给你一个长度为 n 、下标从 0 开始的二进制字符串 target 。你自己有另一个长度为 n 的二进制字符串 s ,最初每一位上都是 0 。你想要让 s 和 target 相等。

在一步操作,你可以选择下标 i(0 <= i < n)并翻转在 闭区间 [i, n - 1] 内的所有位。翻转意味着 '0' 变为 '1' ,而 '1' 变为 '0' 。

返回使 s 与 target 相等需要的最少翻转次数。

示例 1:

输入:target = "10111"
输出:3
解释:最初,s = "00000" 。
选择下标 i = 2: "00000" -> "00111"
选择下标 i = 0: "00111" -> "11000"
选择下标 i = 1: "11000" -> "10111"
要达成目标,需要至少 3 次翻转。


示例 2:

输入:target = "101"
输出:3
解释:最初,s = "000" 。
选择下标 i = 0: "000" -> "111"
选择下标 i = 1: "111" -> "100"
选择下标 i = 2: "100" -> "101"
要达成目标,需要至少 3 次翻转。


示例 3:

输入:target = "00000"
输出:0
解释:由于 s 已经等于目标,所以不需要任何操作
 

提示:

n == target.length
1 <= n <= 105
target[i] 为 '0' 或 '1'

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-suffix-flips
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路:

首先要手动画下翻转图,找下规律

比如:10111

00000

00111

01000

10111

暂时看不清楚的话,反过来看就清楚了,把题目换成如何把字串变为 0 的次数

那么从左至右,我们看见了 1,就要去做翻转,然后再下一位,正好是个逆序

可是代码怎么实现呢?有点麻烦

再来观察,如果中间元素是相邻的同类型,比如同为 1,或同为0

在翻转的时候我们其实是一起翻转的,那么我们就可以把这些同类型的看作只有一个

比如:1010001,我们来逆序翻转的话

10100010101110
01011100010001
00100010001110
00011100000001
00000010000000

优化后其实就是:10101 的翻转

正好翻转次数是 这个字串的 1 开始的长度,

如果是 0 开始话:00110,其实看作的是10,长度为 2 

不信你可以试试看

这样的规律找到后实现代码就容易许多

方法一、统计字串个数

int minFlips(char * target){
	char *s = target;
	int cnt = 0;
	
	int i =0;
	char prev = '0';
	while(s[i])
	{
		if(s[i] != prev)
		{
			cnt++;
			prev = s[i];
		}
		
		i++;
	}
	
	return cnt;
}

查看更多刷题笔记

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值