C++ 中翻转最少次数的连续 0 和 1 子串所需的最小翻转次数

2025年3月21日 | 阅读 4 分钟

在本文中,我们将讨论如何在 C++ 中找到生成连续 0 和 1 子串所需的最少翻转次数

连续字符序列被称为 0 和 1 的子串。它可以通过从原始字符串中以任何顺序选择零个或多个字符来创建,前提是没有字符被遗漏。

以字符串 "1100" 为例。存在以下子串:"1", "0", "11", "10", "100", "110", 和 "1100"。空字符串是所有字符串的子串,它可以通过从原始字符串中精确选择 0 个字符来生成。

示例 1

让我们编写一个程序来查找在 C++ 中生成连续的 0 和 1 子串所需的最少翻转次数。

输出

Minimum flips required to generate continuous substrings of 0's and 1's in C++

说明

  1. 定义函数 minFlips
    • 在输入的二进制 字符串 中,此函数计算生成连续的 0 和 1 子串所需的最少翻转次数。
    • Flips 最初设置为 0,prev 设置为字符串的第一个字符。
    • 它从第二个字符开始,并遍历整个字符串。
    • 如果当前字符与前一个字符不同,则翻转计数增加,并且前一个字符更新。
    • 最终,它返回总翻转次数。
  2. 主函数(primary)
    • 它请求用户输入一个二进制字符串。
    • 它读取输入字符串。
    • 它使用输入字符串调用 minFlips
    • 将所需的最小翻转次数输出到控制台。

复杂度分析

时间复杂度

查找所需的最少翻转次数的时间复杂度是 O(n)。

空间复杂度

查找所需的最少翻转次数的空间复杂度是 O(1)。

示例 2

让我们编写一个程序,使用 C++ 中的递归来查找生成连续的 0 和 1 子串所需的最少翻转次数。

输出

Minimum flips required to generate continuous substrings of 0's and 1's in C++

说明

  1. 递归函数 minFlips 的定义
    • 在输入的 二进制 字符串中,此函数确定生成连续的 0 和 1 子串所需的最少翻转次数。
    • 需要四个参数
    • s: 输入的文本。
    • index: 当前正在处理的索引。
    • prev: 之前遇到的字符。
    • flips: 当前的翻转次数。
    • 它确定索引是否超过或等于字符串的长度。如果为 true,则返回总翻转次数。
    • 如果当前字符 s[index] 与前一个字符 prev 不同,它会递归调用自身,将索引增加 1,将 prev 更新为 s[index],并将 flips 增加 1。
    • 如果当前字符与前一个字符相同,它会递归调用自身而不增加翻转计数。
    • 最终,它返回迭代调用的结果。
  2. 主函数(primary)
    • 它请求用户输入一个二进制字符串。
    • 读取输入字符串。
    • 使用输入字符串调用 minFlips 方法。
    • 将所需的最小翻转次数输出到控制台。

复杂度分析

时间复杂度

查找所需的最少翻转次数的时间复杂度是 O(n)。

空间复杂度

查找所需的最少翻转次数的空间复杂度是 O(n)。

结论

总而言之,找到生成连续的 0 和 1 子串所需的最少翻转次数是一个任务,其解决方案取决于问题的约束和规范。完成此操作所需的最小翻转次数取决于字符串和“连续”子串的特性。在解决困难时,通常有几种不同的方法可以使用。例如,解决类似问题的两种替代方案是贪婪计算和 动态规划


下一个主题C++ 中的比较器