X 0 和 Y 1 的长度为 N 的二进制字符串的计数
给定正整数N 、 X和Y 。任务是找到长度为 N 且具有X 0和Y 1的唯一二进制字符串的计数。
例子:
Input: N=5, X=3, Y=2
Output: 10
Explanation: There are 10 binary strings of length 5 with 3 0s and 2 1s, such as:
00011, 00101, 01001, 10001, 00110, 01010, 10010, 01100, 10100, 11000.
Input: N=3, X=1, Y=2
Output: 3
Explanation: There are 3 binary strings of length 3 with 1 0s and 2 1s, such as: 011, 101, 110
天真的方法:生成所有长度为 N 的二进制字符串,然后计算具有 X 0 和 Y 1 的字符串的数量。
时间复杂度: O(2 N )
辅助空间: O(2 N )
更好的方法:这个问题也可以使用组合数学来解决。如果长度为 N,给定 X 0s,那么将有 Y = (N – X) 1s。所以我们可以把它想象成一个长度为 N 的字符串,其中包含 X 0 和 Y 1。我们需要为此找到唯一组合的数量,可以通过 _{X}^{N}\textrm{C} 或 _{Y}^{N}\textrm{C} 获得。这可以使用帕斯卡三角形来计算组合值。
时间复杂度: O(N)
空间复杂度: O(N 2 )
注意:如果对 X 和 Y 有多个查询,这种方法是最好的。那么它也将具有相同的时间和空间复杂度。
空间优化方法:如果我们借助公式 _{X}^{N}\textrm{C} = N!/(X!*(NX)!) 并计算使用阶乘的值。
下面是上述方法的实现:
C++
#include
using namespace std;
// Function to calculate factorial
long long int fact(int f)
{
f++;
long long int ans = 1;
// Loop to calculate factorial of f
while (--f > 0)
ans = ans * f;
return ans;
}
// Function to calculate combination nCr
long long int countWays(int N, int X, int Y)
{
return (fact(N) / (fact(X) * fact(Y)));
}
// Driver code
int main()
{
int N = 5, X = 3, Y = 2;
cout << countWays(N, X, Y) << endl;
return 0;
}
Java
// Java program for the above approach
public class GFG{
// Function to calculate factorial
static int fact(int f)
{
f++;
int ans = 1;
// Loop to calculate factorial of f
while (--f > 0)
ans = ans * f;
return ans;
}
// Function to calculate combination nCr
static int countWays(int N, int X, int Y)
{
return (fact(N) / (fact(X) * fact(Y)));
}
// Driver Code
public static void main(String args[])
{
int N = 5, X = 3, Y = 2;
System.out.println(countWays(N, X, Y));
}
}
// This code is contributed by AnkThon
Python3
# Function to calculate factorial
def fact(f):
ans = 1;
# Loop to calculate factorial of f
while (f):
ans = ans * f;
f -= 1
return ans;
# Function to calculate combination nCr
def countWays(N, X, Y):
return fact(N) // (fact(X) * fact(Y));
# Driver code
N = 5
X = 3
Y = 2
print(countWays(N, X, Y))
# This code is contributed by gfgking
C#
// C# program for the above approach
using System;
using System.Collections.Generic;
class GFG{
// Function to calculate factorial
static int fact(int f)
{
f++;
int ans = 1;
// Loop to calculate factorial of f
while (--f > 0)
ans = ans * f;
return ans;
}
// Function to calculate combination nCr
static int countWays(int N, int X, int Y)
{
return (fact(N) / (fact(X) * fact(Y)));
}
// Driver Code
public static void Main()
{
int N = 5, X = 3, Y = 2;
Console.Write(countWays(N, X, Y));
}
}
// This code is contributed by sanjoy_62.
Javascript
10
时间复杂度: O(N)
辅助空间: O(1)
注意:在多个(Q)查询的情况下,这种方法的时间复杂度为 O(Q*N)。