地址:
力扣https://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,我们来逆序翻转的话
1010001 | 0101110 |
0101110 | 0010001 |
0010001 | 0001110 |
0001110 | 0000001 |
0000001 | 0000000 |
优化后其实就是: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;
}