📌  相关文章
📜  形成给定二进制字符串所需的最少翻转(1)

📅  最后修改于: 2023-12-03 14:54:15.216000             🧑  作者: Mango

形成给定二进制字符串所需的最少翻转

给定一个二进制字符串,我们需要通过将其中的一些 0 翻转为 1 来获取一个全为 1 的字符串。计算实现这个目标所需要的最少翻转次数。

例如,给定字符串 "00110",我们需要将第二个和第三个 0 翻转为 1,以得到全为 1 的字符串 "11111",最少翻转次数为 2。

解法

我们可以考虑使用贪心算法来解决这个问题。

在从左到右扫描字符串时,我们用变量 cnt 记录当前字符之前的 0 的个数。如果当前的字符是 '1',我们不需要翻转任何字符,因此可以直接跳过。如果当前的字符是 '0',我们有以下两种情况:

  • 我们翻转当前的 '0',则 cnt 增加 1;
  • 我们不翻转当前的 '0',则需要翻转 cnt 个之前的 '1',以保证这些 '1' 可以和当前的 '0' 组成连续的 1 区间。在翻转 cnt 个 '1' 后,cnt 变为 0。

根据以上贪心策略,我们可以得到以下代码实现:

def minFlipsMonoIncr(s: str) -> int:
    cnt, flips = 0, 0
    for ch in s:
        if ch == '1':
            pass
        else:
            flips = min(cnt, flips + 1)
            cnt += 1
    return flips
复杂度分析

时间复杂度:O(n),其中 n 是字符串的长度。我们只需要遍历字符串一次。

空间复杂度:O(1)。我们只需要使用常数个变量来记录状态。

参考文献