给定一个数字n,我们需要打印出所有n位二进制数,并且左右半部分的总和相等。如果n为奇数,则mid元素可以为0或1。
例子:
Input : n = 4
Output : 0000 0101 0110 1001 1010 1111
Input : n = 5
Output : 00000 00100 01001 01101 01010 01110 10001 10101 10010 10110 11011 11111
这样做的想法是递归地建立左右两半,并跟踪其中的1计数之间的差异。当差变为0并且没有更多字符可添加时,我们将打印一个字符串。
C++
// C++ program to generate all binary strings with
// equal sums in left and right halves.
#include
using namespace std;
/* Default values are used only in initial call.
n is number of bits remaining to be filled
di is current difference between sums of
left and right halves.
left and right are current half substrings. */
void equal(int n, string left="", string right="",
int di=0)
{
// TWO BASE CASES
// If there are no more characters to add (n is 0)
if (n == 0)
{
// If difference between counts of 1s and
// 0s is 0 (di is 0)
if (di == 0)
cout << left + right << " ";
return;
}
/* If 1 remains than string length was odd */
if (n == 1)
{
// If difference is 0, we can put remaining
// bit in middle.
if (di == 0)
{
cout << left + "0" + right << " ";
cout << left + "1" + right << " ";
}
return;
}
/* If difference is more than what can be
be covered with remaining n digits
(Note that lengths of left and right
must be same) */
if ((2 * abs(di) <= n))
{
/* add 0 to end in both left and right
half. Sum in both half will not
change*/
equal(n-2, left+"0", right+"0", di);
/* add 0 to end in both left and right
half* subtract 1 from di as right
sum is increased by 1*/
equal(n-2, left+"0", right+"1", di-1);
/* add 1 in end in left half and 0 to the
right half. Add 1 to di as left sum is
increased by 1*/
equal(n-2, left+"1", right+"0", di+1);
/* add 1 in end to both left and right
half the sum will not change*/
equal(n-2, left+"1", right+"1", di);
}
}
/* driver function */
int main()
{
int n = 5; // n-bits
equal(n);
return 0;
}
Java
// Java program to generate all binary strings
// with equal sums in left and right halves.
import java.util.*;
class GFG
{
// Default values are used only in initial call.
// n is number of bits remaining to be filled
// di is current difference between sums of
// left and right halves.
// left and right are current half substrings.
static void equal(int n, String left,
String right, int di)
{
// TWO BASE CASES
// If there are no more characters to add (n is 0)
if (n == 0)
{
// If difference between counts of 1s and
// 0s is 0 (di is 0)
if (di == 0)
System.out.print(left + right + " ");
return;
}
/* If 1 remains than string length was odd */
if (n == 1)
{
// If difference is 0, we can put
// remaining bit in middle.
if (di == 0)
{
System.out.print(left + "0" + right + " ");
System.out.print(left + "1" + right + " ");
}
return;
}
/* If difference is more than what can be
be covered with remaining n digits
(Note that lengths of left and right
must be same) */
if ((2 * Math.abs(di) <= n))
{
// add 0 to end in both left and right
// half. Sum in both half will not
// change
equal(n - 2, left + "0", right + "0", di);
// add 0 to end in both left and right
// half* subtract 1 from di as right
// sum is increased by 1
equal(n - 2, left + "0", right + "1", di - 1);
// add 1 in end in left half and 0 to the
// right half. Add 1 to di as left sum is
// increased by 1*
equal(n - 2, left + "1", right + "0", di + 1);
// add 1 in end to both left and right
// half the sum will not change
equal(n - 2, left + "1", right + "1", di);
}
}
// Driver Code
public static void main(String args[])
{
int n = 5;
// n-bits
equal(n, "", "", 0);
}
}
// This code is contributed
// by SURENDRA_GANGWAR
Python3
# Python program to generate all binary strings with
# equal sums in left and right halves.
# Default values are used only in initial call.
# n is number of bits remaining to be filled
# di is current difference between sums of
# left and right halves.
# left and right are current half substrings.
def equal(n: int, left = "", right = "", di = 0):
# TWO BASE CASES
# If there are no more characters to add (n is 0)
if n == 0:
# If difference between counts of 1s and
# 0s is 0 (di is 0)
if di == 0:
print(left + right, end = " ")
return
# If 1 remains than string length was odd
if n == 1:
# If difference is 0, we can put remaining
# bit in middle.
if di == 0:
print(left + "0" + right, end = " ")
print(left + "1" + right, end = " ")
return
# If difference is more than what can be
# be covered with remaining n digits
# (Note that lengths of left and right
# must be same)
if 2 * abs(di) <= n:
# add 0 to end in both left and right
# half. Sum in both half will not
# change
equal(n - 2, left + "0", right + "0", di)
# add 0 to end in both left and right
# half* subtract 1 from di as right
# sum is increased by 1
equal(n - 2, left + "0", right + "1", di - 1)
# add 1 in end in left half and 0 to the
# right half. Add 1 to di as left sum is
# increased by 1
equal(n - 2, left + "1", right + "0", di + 1)
# add 1 in end to both left and right
# half the sum will not change
equal(n - 2, left + "1", right + "1", di)
# Driver Code
if __name__ == "__main__":
n = 5 # n-bits
equal(5)
# This code is contributed by
# sanjeev2552
C#
// C# program to generate all binary strings
// with equal sums in left and right halves.
using System;
class GFG
{
// Default values are used only in initial call.
// n is number of bits remaining to be filled
// di is current difference between sums of
// left and right halves.
// left and right are current half substrings.
static void equal(int n, String left,
String right, int di)
{
// TWO BASE CASES
// If there are no more characters
// to add (n is 0)
if (n == 0)
{
// If difference between counts of 1s
// and 0s is 0 (di is 0)
if (di == 0)
Console.Write(left + right + " ");
return;
}
/* If 1 remains than string length was odd */
if (n == 1)
{
// If difference is 0, we can put
// remaining bit in middle.
if (di == 0)
{
Console.Write(left + "0" +
right + " ");
Console.Write(left + "1" +
right + " ");
}
return;
}
/* If difference is more than what can be
be covered with remaining n digits
(Note that lengths of left and right
must be same) */
if ((2 * Math.Abs(di) <= n))
{
// add 0 to end in both left and right
// half. Sum in both half will not
// change
equal(n - 2, left + "0", right + "0", di);
// add 0 to end in both left and right
// half* subtract 1 from di as right
// sum is increased by 1
equal(n - 2, left + "0",
right + "1", di - 1);
// add 1 in end in left half and 0 to the
// right half. Add 1 to di as left sum is
// increased by 1*
equal(n - 2, left + "1",
right + "0", di + 1);
// add 1 in end to both left and right
// half the sum will not change
equal(n - 2, left + "1", right + "1", di);
}
}
// Driver Code
public static void Main(String []args)
{
int n = 5;
// n-bits
equal(n, "", "", 0);
}
}
// This code is contributed by 29AjayKumar
输出:
10001 10101 10010 10110 11011 11111