根据给定条件,从数组中构建一个长度为K的二进制字符串

根据给定条件,从数组中构建一个长度为k的二进制字符串

在本教程中,我们需要构造一个长度为 K 的二进制字符串,如果使用数组元素可以实现等于 I 的子集和,则它的第 i 个索引处应包含“1”。我们将学习两种解决问题的方法。在第一种方法中,我们将使用动态规划方法来检查子集和等于索引“I”是否可能。在第二种方法中,我们将使用位集通过数组元素查找所有可能的和。

问题陈述 – 我们给出了一个包含 N 个整数的数组。此外,我们还给出了表示二进制字符串长度的整数 M。我们需要创建一个长度为 M 的二进制字符串,使其遵循以下条件。

如果我们能从数组中找到总和等于索引“I”的子集,则索引“I”处的字符为 1;否则为 0。

我从1开始的索引。

示例示例

Input –  arr = [1, 2] M = 4
Output – 1110

说明

总和等于 1 的子集是 {1}。

总和等于 2 的子集是 {2}。

总和等于 3 的子集是 {1, 2}。

我们找不到总和等于 4 的子集,因此我们将 0 放在第 4 个索引处。

Input –  arr = [1, 3, 1] M = 9
Output – 111110000

说明

我们可以创建所有可能的组合,以使总和在1到5之间。所以,前5个字符是1,最后4个字符是0。

Input –  arr = [2, 6, 3] M = 6
Output – 011011

说明

使用数组元素无法得到等于1和4的和,因此我们将0放置在第一个和第四个索引位置。

方法 1

在这种方法中,我们将使用动态规划来检查是否可以使用数组元素构造等于索引’I’的总和。我们将为每个索引检查它,并将1或0附加到一个二进制字符串中。

算法

步骤 1 – 创建大小为 N 的向量并使用整数值对其进行初始化。另外,定义字符串类型的“bin”变量并使用空字符串对其进行初始化。

第二步 – 使用for循环使总迭代次数等于字符串长度。

第三步 – 在for循环中,通过将数组N和索引值作为参数调用isSubsetSum()函数。

步骤 4 – 如果 isSubsetSum() 函数返回 true,则将“1”附加到“bin”。否则,将“0”附加到“bin”。

第 5 步 – 定义 isSubsetSum() 函数以检查是否可以使用数组元素求和。

步骤 5.1 – 定义一个名为 dpTable 的二维向量。

步骤 5.2 – 将 ‘dpTable[i][0]’ 初始化为 true,因为总和为零总是可能的。这里,’I’ 是索引值。

步骤 5.3 – 将 ‘dpTable [0] [j]’ 初始化为 false,因为空数组的和是不可能的。

步骤 5.4 – 现在,使用两个嵌套循环。第一个循环从1到N进行迭代,另一个循环从1到sum进行迭代。

步骤 5.5 – 在 for 循环中,如果当前元素的值大于总和,则忽略它。

步骤 5.6 − 否则,包括或排除元素以获得总和。

步骤 5.7 − 返回包含结果的 ‘dpTable[N][sum]’。

示例

#include #include using namespace std;// Function to check if subset-sum is possiblebool isSubsetSum(vector &arr, int N, int sum){   vector<vector> dpTable(N + 1, vector(sum + 1, false));      // Base cases   for (int i = 0; i <= N; i++)         // If the sum is zero, then the answer is true      dpTable[i][0] = true;         // for an empty array, the sum is not possible   for (int j = 1; j <= sum; j++)      dpTable[0][j] = false;         // Fill the dp table   for (int i = 1; i <= N; i++){      for (int j = 1; j  j)            dpTable[i][j] = dpTable[i - 1][j];                     // else we can either include it or exclude it to get the sum         else            dpTable[i][j] = dpTable[i - 1][j] || dpTable[i - 1][j - arr[i - 1]];      }   }      // The last cell of the dp table contains the result   return dpTable[N][sum];}int main(){   // Given M   int M = 9;      // Creating the vector   vector arr = {1, 3, 1};      // getting the size of the vector   int N = arr.size();      // Initializing the string   string bin = "";      // Making k iteration to construct the string of length k   for (int i = 1; i <= M; i++){         // if the subset sum is possible, then add 1 to the string, else add 0      if (isSubsetSum(arr, N, i)){         bin += "1";      }      else{         bin += "0";      }   }      // print the result.   cout << "The constructed binary string of length " << M << " according to the given conditions is ";   cout << bin;   return 0;}

输出

The constructed binary string of length 9 according to the given conditions is 111110000

时间复杂度 – O(N^3),因为 isSubsetSum() 的时间复杂度为 O(N^2),我们在驱动程序代码中调用它 N 次。

空间复杂度 – O(N^2),因为我们在isSubsetSum()函数中使用了一个二维向量。

使用Bitset的方法

在这种方法中,我们将使用位集通过组合数组的不同元素来查找所有可能的总和值。这里,bitset 意味着它创建一个二进制字符串。在结果位集中,它的每一位都代表总和是否可能等于特定索引,我们需要在这里找到它。

算法

第 1 步 – 定义数组和 M。此外,定义 createBinaryString() 函数。

第 2 步 – 接下来,定义所需长度的位集,这将创建一个二进制字符串。

第三步 – 将bit[0]初始化为1,因为总和为0总是可能的。

第 4 步 – 使用 for 循环迭代数组元素

步骤 5 – 首先,对数组元素执行“bit”左移操作。然后将结果值与位值进行或运算。

步骤 6 − 从索引 1 到 M 打印位集的值。

示例

#include using namespace std;// function to construct the binary stringvoid createBinaryString(int array[], int N, int M){   bitset bit;      // Initialize with 1   bit[0] = 1;      // iterate over all the integers   for (int i = 0; i < N; i++){      // perform left shift by array[i], and OR with the previous value.      bit = bit | bit << array[i];   }      // Print the binary string   cout << "The constructed binary string of length " << M << " according to the given conditions is ";   for (int i = 1; i <= M; i++){      cout << bit[i];   }}int main(){   // array of integers   int array[] = {1, 4, 2};   int N = sizeof(array) / sizeof(array[0]);      // value of M, size of the string   int M = 8;   createBinaryString(array, N, M);}

输出

The constructed binary string of length 8 according to the given conditions is 11111110

时间复杂度 – O(N),因为我们使用单个 for 循环。

空间复杂度 – O(N),因为我们存储了位集的值。

结论

在这里,我们优化了第二种方法,从空间和时间复杂度来看,它比第一种方法更好。然而,如果你没有对位集的了解,第二种方法可能对初学者来说很难理解。

以上就是根据给定条件,从数组中构建一个长度为K的二进制字符串的详细内容,更多请关注创想鸟其它相关文章!

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

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2025年12月17日 21:51:34
下一篇 2025年12月15日 06:45:49

相关推荐

  • 排序二进制字符串所需删除的最小字符数,以使其按升序排列

    在计算机科学中,字符串操作是一个重要的主题,涉及到拼接、子串、反转等操作。与字符串操作相关的一个常见问题是从二进制字符串中移除所有的0。在本文中,我们将讨论一种使用最少数量的非相邻对翻转来解决这个问题的算法。 问题陈述 给定一个二进制字符串,我们必须使用最少次数的非相邻对翻转来删除字符串中的所有 0…

    2025年12月17日
    000
  • 十进制转二进制的C程序?

    将整数从十进制 (base-10) 转换为二进制 (base-2)。假设整数的大小为 32 位,需要将数字除以基数。计算机使用它来将整数值更改为计算机的字节。 Input:10Output:1010 说明 如果十进制数是10 10除以2余数为零。因此,0。 将 10 除以 2。新数字为 10/2 =…

    2025年12月17日
    000
  • C++程序在数组开头添加元素

    通过使用数组和数据结构,可以在多个内存位置上存储同质(相同)数据。使用数组的关键好处是我们可以使用索引参数从任何位置检索它们。这种数据结构变得线性,因为数据必须逐步插入和提取。我们只需要将该元素的索引或位置号放在方括号内,就可以从数组中检索它。在本文中,我们将使用数组A和另一个元素e。我们将在C++…

    2025年12月17日
    000
  • 使用C++找到数组中唯一配对的数量

    我们需要适当的知识才能在 C++ 的数组语法中创建几个唯一的对。在查找唯一对的数量时,我们计算给定数组中的所有唯一对,即可以形成所有可能的对,其中每个对应该是唯一的。例如 – Input : array[ ] = { 5, 5, 9 }Output : 4Explanation : Th…

    2025年12月17日
    000
  • 十进制转二进制的C语言程序实现

    问题 如何使用C语言中的函数将十进制数转换为二进制数? 解决办法 在在这个程序中,我们在 main() 中调用一个二进制函数。被调用的二进制数转换函数将执行实际的转换。 我们使用的将十进制数转换为二进制数的调用函数的逻辑如下 – while(dno != 0){ rem = dno % …

    2025年12月17日 好文分享
    000
  • 一个数组可以重复分割成具有相等和的子数组的次数

    在C++中,我们有一个vector头文件,可以在运行时更改数组的大小。在本文中,我们将学习数组可以重复分割成具有相等和的子数组的次数的概念。 Let’s take an example to show an array partition with an equal sum. 给定的数组是{1,2,…

    2025年12月17日
    000
  • C程序用于在数组中找到第二大和第二小的数字

    输入数组元素,然后使用交换技术按降序排列数字。随后,在索引位置的帮助下,尝试打印数组中第二大和第二小的元素。 数组用于保存同一个名称下的一组公共元素。 数组用于保存同一个名称下的一组公共元素。 p> C 语言中的数组操作如下 – 插入删除搜索 li> 算法 下面给出的是一种查…

    2025年12月17日
    000
  • 用C++编写一个程序,找出数组中所有元素对之间第k小的差值

    假设我们有一个包含多个整数的列表。我们必须找出数组中每对值之间的差异,并找出第 k 个最小的差异数。索引从 0 开始,值 k 作为输入提供给我们。 因此,如果输入类似于numbers = {2, 6, 4, 8}, k = 2,那么输出将为 2。 两对之间的差异为 – (2, 6) = …

    2025年12月17日
    000
  • C程序在数组中找到最小和最大的质数

    问题陈述 给定一个包含 n 个正整数的数组。我们必须找到素数具有最小值和最大值的数字。 如果给定的数组是 – arr [] = {10, 4, 1, 12, 13, 7, 6, 2, 27, 33}then minimum prime number is 2 and maximum pr…

    2025年12月17日
    000
  • 使用给定的操作将数组缩减为一个整数,使用C++实现

    给定一个整数变量Number作为输入。让我们考虑一个包含范围在1到Number之间的元素的数组,元素的顺序可以是任意的。如果我们在数组上执行Number-1次操作,操作如下: 我们从数组中选择两个元素A和B 从数组中移除A和B 将A和B的平方和添加到数组中 立即学习“C++免费学习笔记(深入)”; …

    2025年12月17日
    000
  • 使用C++将数组重新排列为最大最小形式

    我们得到一个排序数组。我们需要以最大、最小形式排列这个数组,即第一个元素是最大元素,第二个元素是最小元素,第三个元素是第二个最大元素,第四个元素是第二个最小元素,依此类推,例如 – Input : arr[ ] = { 10, 20, 30, 40, 50, 60 }Output : {…

    2025年12月17日
    000
  • 在C/C++中,4维数组

    一个4维数组是由3维数组组成的数组。 算法 Begin. Declare the variables. Declare the array elements. Take the no of elements as input. Take the elements as input. Print th…

    2025年12月17日
    000
  • 在C程序中,从给定的数组中打印下三角矩阵模式

    给定一个 n x n 的矩阵,任务是以下三角形式打印出该矩阵。 下三角矩阵是一个矩阵,其主对角线以下的元素包括主对角线元素,其余元素均为零。 我们通过以下图示来理解: 上述绿色元素是主对角线以下的元素,红色元素是主对角线以上的元素,它们被设为零。 示例 Input: matrix[3][3] = {…

    2025年12月17日
    000
  • C++另一个数组中较小值的排列

    本教程中提供了两个数组 A 和 B。例如,我们需要输出 A 的任意排列,使得 A[ I ] > B[ I ] 的索引最大化,例如 Input: A = [12, 22, 41, 13],B = [1, 20, 10, 12]Output: 12, 22, 41, 13Input: A = [2…

    2025年12月17日
    000
  • 如何使用C语言将二进制转换为十六进制?

    二进制数以 1 和 0 表示。 16 位的十六进制数系统为 {0,1,2,3…..9, A(10), B(11),… …F(15)} 为了从二进制表示转换为十六进制表示,位串 id 被分组为 4 位块,从最低有效侧开始称为半字节。每个块都替换为相应的十六进制数字。 让我们看一个示例,以清楚地了解十六…

    2025年12月17日
    000
  • 如何在C语言中将数组中的单个元素作为参数传递给函数?

    如果要将单个元素作为参数传递,则在函数调用中必须给出数组元素及其下标。 为了接收这些元素,在函数定义中使用简单变量。 示例1 #includemain (){ void display (int, int); int a[5], i; clrscr(); printf (“enter 5…

    2025年12月17日
    000
  • C/C++程序中的数组

    数组是一组固定数量的相同数据类型的项目。这些元素存储在内存中的连续内存位置中。 可以使用方括号“[]”和数组名称像a[4]、a[3]等从其索引值访问值的每个单个元素。 声明数组 在c/c++编程语言中,通过定义数组的类型和长度(元素数量)来声明数组。下面的语法显示了在c/c++中声明数组的方法− d…

    2025年12月17日
    000
  • C++程序以递增顺序重新排列数组中所有x的倍数元素

    我们有一个整数类型的数组 `int arr[]` 和一个整数类型的变量 `x`。任务是重新排列数组的所有元素,使它们能够被给定的整数值 `x` 整除,并且排列顺序应该是递增的。 让我们看看这个问题的各种输入输出情况: 输入 – int arr[] = {4,24, 3, 5, 7, 22…

    2025年12月17日
    000
  • 在C语言中,结构体(Structure)和数组(Array)之间的区别是什么?

    在 C 中,结构体和数组都用作数据类型的容器,即在结构体和数组中我们都可以存储数据,也可以对它们执行不同的操作。 基于内部实现,以下是两者之间存在一些基本差异。 Sr.编号 键 结构 数组 1定义结构体可以定义为一种数据结构,用作容器,可以容纳不同类型的变量。另一方面,数组是一种用作容器的数据结构,…

    2025年12月17日
    000
  • 使用交换最小化两个数组中最大数的乘积

    数据结构操作现在已成为现代编程和计算中成功解决方案开发的一个重要方面。这是由于随着时间的推移,这些结构所呈现的复杂性不断增加。一个例子是执行交换操作以最小化包含在两个数组中的最大数的总和,从而降低它们的整体值。在这篇文章中,我们讨论了两种使用C++完成这些任务的方法,同时根据不同观点承认了这两种方法…

    2025年12月17日
    000

发表回复

登录后才能评论
关注微信