题目
给你一个长度为 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 已经等于目标,所以不需要任何操作
解题
方法一:模拟
从左到右开始翻
c为遍历到当前位的目标字符,flag为当前这个位的目前的字符。
从左到右,每翻一次,后面的也要翻转,因此flag也会同步翻。
class Solution { public: int minFlips(string target) { int flag=0; int res=0; for(char c:target){ if(c=='1'&&flag==0){ res++; flag=1; } else if(c=='0'&&flag==1){ res++; flag=0; } } return res; } };