📌  相关文章
📜  X 0 和 Y 1 的长度为 N 的二进制字符串的计数

📅  最后修改于: 2022-05-13 01:56:09.452000             🧑  作者: Mango

X 0 和 Y 1 的长度为 N 的二进制字符串的计数

给定正整数NXY 。任务是找到长度为 N 且具有X 0Y 1唯一二进制字符串的计数。

例子:

天真的方法:生成所有长度为 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)。