Print all interleavings of given two strings - GeeksforGeeks

12 Jan, 2022
Given two strings str1 and str2, write a function that prints all interleavings of the given two strings. You may assume that all characters in both strings are different Example:  
Input: str1 = "AB",  str2 = "CD"
Output:
    ABCD
    ACBD
    ACDB
    CABD
    CADB
    CDAB

Input: str1 = "AB",  str2 = "C"
Output:
    ABC
    ACB
    CAB
An interleaved string of given two strings preserves the order of characters in individual strings. For example, in all the interleavings of above first example, ‘A’ comes before ‘B’ and ‘C’ comes before ‘D’. 
Let the length of str1 be m and the length of str2 be n. Let us assume that all characters in str1 and str2 are different. Let count(m, n) be the count of all interleaved strings in such strings. The value of count(m, n) can be written as following.  
     count(m, n) = count(m-1, n) + count(m, n-1)
     count(1, 0) = 1 and count(0, 1) = 1
To print all interleavings, we can first fix the first character of str1[0..m-1] in output string, and recursively call for str1[1..m-1] and str2[0..n-1]. And then we can fix the first character of str2[0..n-1] and recursively call for str1[0..m-1] and str2[1..n-1]. Thanks to akash01 for providing following C implementation.  
C
C++
Java
Python3
// C program to print all interleavings of given two strings#include <stdio.h>#include <stdlib.h>#include <string.h> // The main function that recursively prints all interleavings.// The variable iStr is used to store all interleavings (or// output strings) one by one. // i is used to pass next available place in iStrvoid printIlsRecur (char *str1, char *str2, char *iStr, int m,                    int n, int i){    // Base case: If all characters of str1 and str2 have been    // included in output string, then print the output string    if (m==0 && n==0)        printf("%s\n", iStr) ;     // If some characters of str1 are left to be included, then    // include the  first character from the remaining characters    // and recur for rest    if (m != 0)    {        iStr[i] = str1[0];        printIlsRecur (str1 + 1, str2, iStr, m-1, n, i+1);    }     // If some characters of str2 are left to be included, then    // include the  first character from the remaining characters    // and recur for rest    if (n != 0)    {        iStr[i] = str2[0];        printIlsRecur(str1, str2+1, iStr, m, n-1, i+1);    }} // Allocates memory for output string and uses printIlsRecur()// for printing all interleavingsvoid printIls (char *str1, char *str2, int m, int n){   // allocate memory for the output string   char *iStr= (char*)malloc((m+n+1)*sizeof(char));    // Set the terminator for the output string   iStr[m+n] = '\0';    // print all interleavings using printIlsRecur()   printIlsRecur (str1, str2, iStr, m, n, 0);    // free memory to avoid memory leak   free(iStr);} // Driver program to test above functionsint main(){    char str1[] = "AB";    char str2[] = "CD";    printIls (str1, str2, strlen(str1), strlen(str2));    return 0;}
// C++ program to print all interleavings of given two strings#include <bits/stdc++.h>using namespace std; // The main function that recursively prints all interleavings.// The variable iStr is used to store all interleavings (or// output strings) one by one.// i is used to pass next available place in iStrvoid printIlsRecur (char *str1, char *str2, char *iStr, int m,                    int n, int i){    // Base case: If all characters of str1 and str2 have been    // included in output string, then print the output string    if (m == 0 && n == 0)        cout << iStr << endl ;     // If some characters of str1 are left to be included, then    // include the first character from the remaining characters    // and recur for rest    if (m != 0)    {        iStr[i] = str1[0];        printIlsRecur (str1 + 1, str2, iStr, m - 1, n, i + 1);    }     // If some characters of str2 are left to be included, then    // include the first character from the remaining characters    // and recur for rest    if (n != 0)    {        iStr[i] = str2[0];        printIlsRecur(str1, str2 + 1, iStr, m, n - 1, i + 1);    }} // Allocates memory for output string and uses printIlsRecur()// for printing all interleavingsvoid printIls (char *str1, char *str2, int m, int n){    // allocate memory for the output string    char *iStr= new char[((m + n + 1)*sizeof(char))];         // Set the terminator for the output string    iStr[m + n] = '\0';         // print all interleavings using printIlsRecur()    printIlsRecur (str1, str2, iStr, m, n, 0);         // free memory to avoid memory leak    free(iStr);} // Driver codeint main(){    char str1[] = "AB";    char str2[] = "CD";    printIls (str1, str2, strlen(str1), strlen(str2));    return 0;} // This is code is contributed by rathbhupendra
/*package whatever //do not write package name here */ import java.io.*; class GFG {    /*     * This methods prints interleaving string of two     * strings     * @param s1  String 1     * @param i   current index of s1     * @param s2  String 2     * @param j  Current index of s2     * @param asf String containing interleaving string of     *     s1 and s2     *     */    static void printInterLeaving(String s1, int i,                                  String s2, int j,                                  String asf)    {        if (i == s1.length() && j == s2.length()) {            System.out.println(asf);        }         // Either we will start with string 1        if (i < s1.length())            printInterLeaving(s1, i + 1, s2, j,                              asf + s1.charAt(i));        // Or with string 2        if (j < s2.length())            printInterLeaving(s1, i, s2, j + 1,                              asf + s2.charAt(j));    }     /*     * Main function executed by JVM     * @param args String array     */    public static void main(String[] args)    {        // TODO Auto-generated method stub         String s1 = "AB"; // String 1        String s2 = "CD"; // String 2               printInterLeaving(s1, 0, s2, 0, "");    }} /* Code by mahi_07 */
# Python program to print all interleavings of given two strings # Utility functiondef toString(List):    return "".join(List) # The main function that recursively prints all interleavings.# The variable iStr is used to store all interleavings (or output# strings) one by one.# i is used to pass next available place in iStrdef printIlsRecur(str1, str2, iStr, m, n, i):     # Base case: If all characters of str1 and str2 have been    # included in output string, then print the output string    if m==0 and n==0:        print (toString(iStr))     # If some characters of str1 are left to be included, then    # include the first character from the remaining characters    # and recur for rest    if m != 0:        iStr[i] = str1[0]        printIlsRecur(str1[1:], str2, iStr, m-1, n, i+1)     # If some characters of str2 are left to be included, then    # include the first character from the remaining characters    # and recur for rest    if n != 0:        iStr[i] = str2[0]        printIlsRecur(str1, str2[1:], iStr, m, n-1, i+1) # Allocates memory for output string and uses printIlsRecur()# for printing all interleavingsdef printIls(str1, str2, m, n):    iStr = [''] * (m+n)     # print all interleavings using printIlsRecur()    printIlsRecur(str1, str2, iStr, m, n, 0) # Driver program to test the above functionstr1 = "AB"str2 = "CD"printIls(str1, str2, len(str1), len(str2)) # This code is contributed by Bhavya Jain
Output:
ABCD
ACBD
ACDB
CABD
CADB
CDAB
Time Complexity: O(2 ^ (m+n))
Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above. 
rathbhupendra
mahi_07
anikakapoor
amartyaghoshgfg
Strings
Strings
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
Check for Balanced Brackets in an expression (well-formedness) using Stack
Python program to check if a string is palindrome or not
KMP Algorithm for Pattern Searching
Different methods to reverse a string in C/C++
Array of Strings in C++ (5 Different Ways to Create)
Convert string to char array in C++
Longest Palindromic Substring | Set 1
Caesar Cipher in Cryptography
Check whether two strings are anagram of each other
Top 50 String Coding Problems for Interviews