📌  相关文章
📜  生成所有长度为n的二进制字符串,其中子字符串“ 01”恰好出现两次

📅  最后修改于: 2021-05-04 17:41:47             🧑  作者: Mango

给定一个整数N ,任务是生成所有可能的长度为N的二进制字符串,这些二进制字符串恰好包含两次作为子字符串的“ 01”

例子:

方法:使用回溯可以解决此问题。为了生成二进制字符串,我们实现了一次生成每个位的函数,更新二进制字符串的状态(当前长度,模式出现的次数)。然后递归调用该函数,并根据二进制字符串的当前状态,该函数将决定如何生成下一位或打印出二进制字符串(如果满足问题的要求)。

对于此问题,回溯策略看起来像我们生成的二叉树,每个节点的值可以为01
例如,在N = 4的情况下,树将如下所示:

下面是上述方法的实现:

C++
// C++ implementation of the approach
#include 
#include 
using namespace std;
  
// Utility function to print the given binary string
void printBinStr(int* str, int len)
{
    for (int i = 0; i < len; i++) {
        cout << str[i];
    }
    cout << endl;
}
  
// This function will be called recursively
// to generate the next bit for given
// binary string according to its current state
void generateBinStr(int* str, int len, int currlen,
                    int occur, int nextbit)
{
  
    // Base-case: if the generated binary string
    // meets the required length and the pattern "01"
    // appears twice
    if (currlen == len) {
  
        // nextbit needs to be  0 because each time
        // we call the function recursively,
        // we call 2 times for 2 cases:
        // next bit is 0 or 1
        // The is to assure that the binary
        // string is printed one time only
        if (occur == 2 && nextbit == 0)
            printBinStr(str, len);
        return;
    }
  
    // Generate the next bit for str
    // and call recursive
    if (currlen == 0) {
  
        // Assign first bit
        str[0] = nextbit;
  
        // The next generated bit will wither be 0 or 1
        generateBinStr(str, len, currlen + 1, occur, 0);
        generateBinStr(str, len, currlen + 1, occur, 1);
    }
    else {
  
        // If pattern "01" occurrence is < 2
        if (occur < 2) {
  
            // Set next bit
            str[currlen] = nextbit;
  
            // If pattern "01" appears then
            // increase the occurrence of pattern
            if (str[currlen - 1] == 0 && nextbit == 1) {
                occur += 1;
            }
            generateBinStr(str, len, currlen + 1, occur, 0);
            generateBinStr(str, len, currlen + 1, occur, 1);
  
            // Else pattern "01" occurrence equals 2
        }
        else {
  
            // If previous bit is 0 then next bit cannot be 1
            if (str[currlen - 1] == 0 && nextbit == 1) {
                return;
  
                // Otherwise
            }
            else {
                str[currlen] = nextbit;
                generateBinStr(str, len, currlen + 1, occur, 0);
                generateBinStr(str, len, currlen + 1, occur, 1);
            }
        }
    }
}
  
// Driver code
int main()
{
  
    int n = 5;
  
    // Length of the resulting strings
    // must be at least 4
    if (n < 4)
        cout << -1;
    else {
        int* str = new int[n];
  
        // Generate all binary strings of length n
        // with sub-string "01" appearing twice
        generateBinStr(str, n, 0, 0, 0);
        generateBinStr(str, n, 0, 0, 1);
    }
  
    return 0;
}


Java
// Java implementation of the above approach 
class GFG 
{
  
    // Utility function to print the given binary string
    static void printBinStr(int[] str, int len) 
    {
        for (int i = 0; i < len; i++)
        {
            System.out.print(str[i]);
        }
        System.out.println();
    }
  
    // This function will be called recursively
    // to generate the next bit for given
    // binary string according to its current state
    static void generateBinStr(int[] str, int len, int currlen,
                                    int occur, int nextbit) 
    {
  
        // Base-case: if the generated binary string
        // meets the required length and the pattern "01"
        // appears twice
        if (currlen == len) 
        {
  
            // nextbit needs to be 0 because each time
            // we call the function recursively,
            // we call 2 times for 2 cases:
            // next bit is 0 or 1
            // The is to assure that the binary
            // string is printed one time only
            if (occur == 2 && nextbit == 0)
            {
                printBinStr(str, len);
            }
            return;
        }
  
        // Generate the next bit for str
        // and call recursive
        if (currlen == 0) 
        {
  
            // Assign first bit
            str[0] = nextbit;
  
            // The next generated bit will wither be 0 or 1
            generateBinStr(str, len, currlen + 1, occur, 0);
            generateBinStr(str, len, currlen + 1, occur, 1);
        } else // If pattern "01" occurrence is < 2
        if (occur < 2) 
        {
  
            // Set next bit
            str[currlen] = nextbit;
  
            // If pattern "01" appears then
            // increase the occurrence of pattern
            if (str[currlen - 1] == 0 && nextbit == 1) 
            {
                occur += 1;
            }
            generateBinStr(str, len, currlen + 1, occur, 0);
            generateBinStr(str, len, currlen + 1, occur, 1);
  
            // Else pattern "01" occurrence equals 2
        } else // If previous bit is 0 then next bit cannot be 1
        if (str[currlen - 1] == 0 && nextbit == 1) 
        {
            return;
  
            // Otherwise
        } 
        else 
        {
            str[currlen] = nextbit;
            generateBinStr(str, len, currlen + 1, occur, 0);
            generateBinStr(str, len, currlen + 1, occur, 1);
        }
    }
  
    // Driver code
    public static void main(String[] args) 
    {
        int n = 5;
  
        // Length of the resulting strings
        // must be at least 4
        if (n < 4) 
        {
            System.out.print(-1);
        } 
        else
        {
            int[] str = new int[n];
  
            // Generate all binary strings of length n
            // with sub-string "01" appearing twice
            generateBinStr(str, n, 0, 0, 0);
            generateBinStr(str, n, 0, 0, 1);
        }
    }
}
  
// This code has been contributed by 29AjayKumar


Python3
# Python3 implementation of the approach
  
# Utility function to print the 
# given binary string
def printBinStr(string, length):
  
    for i in range(0, length): 
        print(string[i], end = "")
      
    print()
  
# This function will be called recursively
# to generate the next bit for given
# binary string according to its current state
def generateBinStr(string, length, currlen,
                            occur, nextbit):
  
    # Base-case: if the generated binary
    # string meets the required length and
    # the pattern "01" appears twice
    if currlen == length:
  
        # nextbit needs to be 0 because each
        # time we call the function recursively,
        # we call 2 times for 2 cases:
        # next bit is 0 or 1
        # The is to assure that the binary
        # string is printed one time only
        if occur == 2 and nextbit == 0:
            printBinStr(string, length)
        return
  
    # Generate the next bit for
    # str and call recursive
    if currlen == 0: 
  
        # Assign first bit
        string[0] = nextbit
  
        # The next generated bit will 
        # either be 0 or 1
        generateBinStr(string, length,
                       currlen + 1, occur, 0)
        generateBinStr(string, length, 
                       currlen + 1, occur, 1)
      
    else:
  
        # If pattern "01" occurrence is < 2
        if occur < 2: 
  
            # Set next bit
            string[currlen] = nextbit
  
            # If pattern "01" appears then
            # increase the occurrence of pattern
            if string[currlen - 1] == 0 and nextbit == 1:
                occur += 1
              
            generateBinStr(string, length, 
                           currlen + 1, occur, 0)
            generateBinStr(string, length, 
                           currlen + 1, occur, 1)
  
            # Else pattern "01" occurrence equals 2
          
        else:
  
            # If previous bit is 0 then next bit cannot be 1
            if string[currlen - 1] == 0 and nextbit == 1: 
                return
  
                # Otherwise
              
            else:
                string[currlen] = nextbit
                generateBinStr(string, length, 
                               currlen + 1, occur, 0)
                generateBinStr(string, length,
                               currlen + 1, occur, 1)
  
# Driver code
if __name__ == "__main__":
  
    n = 5
  
    # Length of the resulting strings
    # must be at least 4
    if n < 4:
        print(-1)
    else:
        string = [None] * n
  
        # Generate all binary strings of length n
        # with sub-string "01" appearing twice
        generateBinStr(string, n, 0, 0, 0)
        generateBinStr(string, n, 0, 0, 1)
      
# This code is contributed by Rituraj Jain


C#
// C# implementation of the above approach 
using System;
      
class GFG 
{
  
// Utility function to print the given binary string
static void printBinStr(int[] str, int len) 
{
    for (int i = 0; i < len; i++)
    {
        Console.Write(str[i]);
    }
    Console.Write("\n");
}
  
// This function will be called recursively
// to generate the next bit for given
// binary string according to its current state
static void generateBinStr(int[] str, int len, int currlen,
                                    int occur, int nextbit) 
{
  
    // Base-case: if the generated binary string
    // meets the required length and the pattern "01"
    // appears twice
    if (currlen == len) 
    {
  
        // nextbit needs to be 0 because each time
        // we call the function recursively,
        // we call 2 times for 2 cases:
        // next bit is 0 or 1
        // The is to assure that the binary
        // string is printed one time only
        if (occur == 2 && nextbit == 0)
        {
            printBinStr(str, len);
        }
        return;
    }
  
    // Generate the next bit for str
    // and call recursive
    if (currlen == 0) 
    {
  
        // Assign first bit
        str[0] = nextbit;
  
        // The next generated bit will wither be 0 or 1
        generateBinStr(str, len, currlen + 1, occur, 0);
        generateBinStr(str, len, currlen + 1, occur, 1);
    } else // If pattern "01" occurrence is < 2
    if (occur < 2) 
    {
  
        // Set next bit
        str[currlen] = nextbit;
  
        // If pattern "01" appears then
        // increase the occurrence of pattern
        if (str[currlen - 1] == 0 && nextbit == 1) 
        {
            occur += 1;
        }
        generateBinStr(str, len, currlen + 1, occur, 0);
        generateBinStr(str, len, currlen + 1, occur, 1);
  
        // Else pattern "01" occurrence equals 2
    } else // If previous bit is 0 then next bit cannot be 1
    if (str[currlen - 1] == 0 && nextbit == 1) 
    {
        return;
  
        // Otherwise
    } 
    else
    {
        str[currlen] = nextbit;
        generateBinStr(str, len, currlen + 1, occur, 0);
        generateBinStr(str, len, currlen + 1, occur, 1);
    }
}
  
// Driver code
public static void Main(String[] args) 
{
    int n = 5;
  
    // Length of the resulting strings
    // must be at least 4
    if (n < 4) 
    {
        Console.Write(-1);
    } 
    else
    {
        int[] str = new int[n];
  
        // Generate all binary strings of length n
        // with sub-string "01" appearing twice
        generateBinStr(str, n, 0, 0, 0);
        generateBinStr(str, n, 0, 0, 1);
    }
}
}
  
// This code is contributed by Princi Singh


输出:
00101
01001
01010
01011
01101
10101