将所有0放在1之前所需的最小移动次数在二进制字符串中

将所有0放在1之前所需的最小移动次数在二进制字符串中

问题陈述

我们给定了二进制字符串 str,我们要求从字符串中删除最少的字符,以便我们可以将所有零放在 1 之前。

示例

输入

str = ‘00110100111’

输出

3

说明

这里,我们可以通过两种方式实现输出3。

我们可以从字符串中删除 arr[2]、arr[3] 和 arr[5] 或 arr[4]、arr[6] 和 arr[7]。

输入

str = ‘001101011’

输出

2

说明

我们可以删除 arr[4] 和 arr[6],将所有零放在 1 之前。

输入

str = ‘000111’

输出

0

说明

在给定的字符串中,所有零都已放置在 1 之前,因此我们不需要从给定字符串中删除任何字符。

方法 1

在第一种方法中,我们将使用两个数组。第一个数组将所有 1 存储在左侧,另一个数组将所有 0 存储在右侧。之后,我们可以将两个数组中第 i 个索引处的元素相加,并找到最小总和。

算法

第 1 步 – 定义长度为 n 的“零”和“一”命名列表,其中 n 是我们可以使用 size() 方法获取的字符串的长度。

步骤 2 – 如果给定字符串中的第一个字符是“1”,则将 1 存储在“ones”数组的第 0 个索引处;否则,存储 0。

步骤 3 – 使用 for 循环从字符串的第二个元素开始遍历。在 for 循环中,使用根据第 i 个索引处的字符串的字符将 Ones[i-1] 与 1 或 0 相加得到的结果值来初始化 Ones[i]。

第 4 步 – 根据给定字符串中的最后一个字符,将 1 或 0 存储在 Zeros[n-1] 处。

步骤 5 – 使用 for 循环从最后第二个字符开始遍历字符串,并根据字符串字符更新零列表的值。

第 6 步 – 定义“min_zeros_to_remove”变量并使用最大整数值对其进行初始化。

第 7 步 – 现在,遍历“零”和“一”列表。从零列表中的“i+1”索引和“一”列表中的“I”索引访问值。之后,添加这两个元素。

步骤 8 – 如果“min_zeros_to_remove”的值小于“min_zeros_to_remove”变量的当前值,则将其值更改为两个数组元素的总和。

步骤 9 – 返回结果值。

示例

#include using namespace std;int minimumZeroRemoval(string str){   int n = str.size();   // arrays to store the prefix sums of zeros and ones   vector zeros(n);   vector ones(n);   // compute total number of 1s at the left of each index   ones[0] = (str[0] == '1') ? 1 : 0;   for (int i = 1; i = 0; i--){      zeros[i] = zeros[i + 1] + ((str[i] == '0') ? 1 : 0);   }   // do the sum of zeros and ones for each index and return the minimum value   int min_zeros_to_remove = INT_MAX;   for (int i = 0; i < n - 1; i++){      min_zeros_to_remove = min(min_zeros_to_remove, zeros[i + 1] + ones[i]);   }   return min_zeros_to_remove;}int main() {   string str = "00110100111";   int count = minimumZeroRemoval(str);   cout << "The minimum number of zeros required to remove from the given string is - " << count;   return 0;}

输出

The minimum number of zeros required to remove from the given string is - 3

时间复杂度 – O(N),因为我们需要 for 循环来遍历大小为 N 的字符串和列表。

空间复杂度 – O(N),因为我们使用两个列表来存储 1 和 0 的计数。

方法2

此方法是第一种方法的优化版本。在这里,我们使用两个变量来存储 1 和 0 的计数,而不是列表。

算法

第 1 步 – 定义“zeros_right”变量并使用 0 进行初始化。

第 2 步 – 遍历字符串,计算给定字符串中“0”字符的总数,并据此更新“zero_right”变量的值。

第 3 步 – 定义“ones_left”变量并初始化为 0。

步骤 4 – 使用 for 循环遍历字符串。如果字符串中第 i 个索引处的字符为“1”,则将“ones_left”变量的值增加 1。否则,将“zeros_right”变量的值减少 1。

第 5 步 – 如果“zeros_right + Ones_left”小于“res”变量的当前值,则更新“res”变量的值。

示例

#include using namespace std;// function to remove zeros from the string to place all zeros before 1.int minimumZeroRemoval(string str){   // counting the total number of zeros in the given string   int zeros_right = 0;   for (int i = 0; i < str.size(); i++) {      if (str[i] == '0')      zeros_right += 1;   }   // variable to store the number of ones from left   int ones_left = 0;   // Size of the string   int len = str.size();   // variable to store the final result   int result = INT_MAX;   // Traverse the string from left to right   for (int i = 0; i < len; i++){      // If the current character is '1', then increment ones_left by 1 else, decrement zeros_right by 1      if (str[i] == '1') {         ones_left += 1;      } else {         zeros_right -= 1;      }      // Store the minimum result and zeros_right + ones_left in result      result = min(result, zeros_right + ones_left);   }   // Return the final result   return result;}int main() {   string str = "001101011";   int count = minimumZeroRemoval(str);   cout << "The minimum number of zeros required to remove from the given string is - " << count;   return 0;}

输出

The minimum number of zeros required to remove from the given string is - 2

时间复杂度 – O(N),当我们迭代字符串时。

空间复杂度 – O(1),因为我们仅使用常量空间。

结论

用户学习了两种从给定二进制字符串中删除最少字符的方法。第二种方法的代码更具可读性,因为我们使用变量来存储零和一的计数,而不是使用列表。

以上就是将所有0放在1之前所需的最小移动次数在二进制字符串中的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/1445630.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 22:41:39
下一篇 2025年12月8日 21:44:58

相关推荐

  • 找到在将一个二进制字符串清空(通过移除非空子字符串)后,0的数量最少的玩家

    在本文中,我们将讨论一个有趣的问题,涉及到字符串操作和博弈论领域:“通过删除非空子字符串来清空二进制字符串,找到剩余0最少的玩家”。这个问题探索了使用二进制字符串进行竞技游戏的概念。我们的目标是在游戏结束后找出剩余0最少的玩家。我们将讨论这个问题,提供一个C++代码实现,并通过一个例子来解释这个概念…

    2025年12月17日
    000
  • 检查一个二进制字符串是否可以通过删除非相邻字符来按降序排序

    在这个问题中,我们需要通过仅删除不相邻的元素来按降序对给定的二进制字符串进行排序。 为了解决这个问题,我们需要删除二进制字符串中所有位于 1 之前的 0。如果我们在字符串中的任何位置发现两个连续的零后面有两个连续的1,则意味着我们无法对字符串进行降序排序。否则,我们可以针对每种情况进行分类。 问题陈…

    2025年12月17日
    000
  • 最长非递增子序列在一个二进制字符串中

    在这个问题中,我们需要找到给定字符串的最长非递增子序列。 非递增的意思是字符要么相同,要么按降序排列。由于二进制字符串仅包含“0”和“1”,因此生成的字符串应以“1”开头并以“0”结尾,或者以“0”或“1”开头和结尾。 为了解决这个问题,我们将统计字符串每个位置的前缀“1”和后缀“0”,并找到前缀“…

    2025年12月17日
    000
  • 计算长度为N的二进制字符串,它们是子字符串的重复拼接

    本文的目的是实现一个程序,用于计算由一个子字符串重复连接而成的长度为N的二进制字符串的数量。 目标是确定通过重复连接给定文本的单个子字符串,可以创建多少长度为N的二进制字符串,其中N是一个正整数。 问题陈述 实现一个程序,用于计算重复连接子字符串的长度为N的二进制字符串的数量。 示例示例1 Let …

    2025年12月17日
    000
  • 使用C++编写,找到以1开头的二进制字符串的唯一排列数量

    在给定的问题中,我们得到一个由0和1组成的字符串;我们需要找到以1开头的所有排列的总数。由于答案可能是一个巨大的数字,所以我们将其取模1000000007后输出。 Input : str =”10101001001″Output : 210Input : str =”101110011″Output…

    2025年12月17日
    000
  • 检查给定二进制字符串的得分

    字节序列被称为二进制字符串,它保存着二进制值。二进制分数通常在0到1的范围内表示,其中1保留给完美模型。在给定的二进制字符串中,如果元素被发现为1,则将其计算为分数并增加计数总和。 让我们以一个二进制分数的例子来说明 – 给定的二进制字符串是 1011010。 在上图中,数字1出现在索引…

    2025年12月17日
    000
  • 找到给定大小的二进制字符串数组中不存在的任意排列

    在这个问题中,我们需要从数组中找到长度为N的所有缺失的二进制字符串。我们可以通过找到长度为N的二进制字符串的所有排列,并检查哪些排列在数组中不存在来解决这个问题。在这里,我们将看到迭代和递归的方法来解决这个问题。 问题陈述 – 我们已经给出了一个包含不同长度的二进制字符串的数组arr[]…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信