Print all interleavings of given two strings
Last Updated :
16 Aug, 2024
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++ 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 iStr
void 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 interleavings
void 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 code
int main()
{
char str1[] = "AB";
char str2[] = "CD";
printIls (str1, str2, strlen(str1), strlen(str2));
return 0;
}
// This is code is contributed by rathbhupendra
C
// 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 iStr
void 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 interleavings
void 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 functions
int main()
{
char str1[] = "AB";
char str2[] = "CD";
printIls (str1, str2, strlen(str1), strlen(str2));
return 0;
}
Java
/*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
# Python program to print all interleavings of given two strings
# Utility function
def 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 iStr
def 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 interleavings
def 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 function
str1 = "AB"
str2 = "CD"
printIls(str1, str2, len(str1), len(str2))
# This code is contributed by Bhavya Jain
C#
using System;
public 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
// *
public static void printInterLeaving(String s1, int i, String s2, int j, String asf)
{
if (i == s1.Length && j == s2.Length)
{
Console.WriteLine(asf);
}
// Either we will start with string 1
if (i < s1.Length)
{
GFG.printInterLeaving(s1, i + 1, s2, j, asf + s1[i].ToString());
}
// Or with string 2
if (j < s2.Length)
{
GFG.printInterLeaving(s1, i, s2, j + 1, asf + s2[j].ToString());
}
}
// * Main function executed by JVM
// * @param args String array
public static void Main(String[] args)
{
// TODO Auto-generated method stub
var s1 = "AB";
// String 1
var s2 = "CD";
// String 2
GFG.printInterLeaving(s1, 0, s2, 0, "");
}
}
// This code is contributed by aadityaburujwale.
JavaScript
// Recursive function to print all interleavings of the two strings
function 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 && n === 0) {
console.log(iStr.join(""));
}
// 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.slice(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.slice(1), iStr, m, n - 1, i + 1);
}
}
// Function to print all interleavings of the two strings
function printIls(str1, str2, m, n) {
// Allocate memory for the output string
let iStr = new Array(m + n);
// Print all interleavings using printIlsRecur
printIlsRecur(str1, str2, iStr, m, n, 0);
}
// Example usage
let str1 = "AB";
let str2 = "CD";
printIls(str1, str2, str1.length, str2.length);
// This code is contributed by lokeshpotta20.
OutputABCD
ACBD
ACDB
CABD
CADB
CDAB
Time Complexity: O(2 ^ (m+n))
Auxiliary Space: O(1)
Approach 2: Using Buttom-Up Approach /Tabulation Method of Dynamic Programming
C++
#include <bits/stdc++.h>
using namespace std;
// Function to print interleavings of two strings
void printInterleavings(string str1, string str2)
{
int m = str1.length();
int n = str2.length();
// Create a 2D vector to store interleavings
vector<vector<vector<string> > > dp(
m + 1, vector<vector<string> >(n + 1));
// Base cases: If one of the strings is empty,
// return the other string
for (int i = 0; i <= m; i++) {
dp[i][0] = { str1.substr(0, i) };
}
for (int j = 0; j <= n; j++) {
dp[0][j] = { str2.substr(0, j) };
}
// Fill in the dynamic programming table
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
// Append the current character of str1 to
// each interleaved string from previous cells
dp[i][j] = dp[i - 1][j];
for (string& s : dp[i][j]) {
s += str1[i - 1];
}
// Append the current character of str2 to each
// interleaved string from previous cells
for (string& s : dp[i][j - 1]) {
dp[i][j].push_back(s + str2[j - 1]);
}
}
}
// Print all interleavings
for (const string& interleaved : dp[m][n]) {
cout << interleaved << endl;
}
}
// Example usage
int main()
{
string str1 = "AB";
string str2 = "CD";
printInterleavings(str1, str2);
return 0;
}
// THIS CODE IS CONTRIBUTED BY YASH
// AGARWAL(YASHAGARWAL2852002)
Java
import java.util.ArrayList;
public class GFG {
// Function to print interleavings of two strings
static void printInterleavings(String str1, String str2) {
int m = str1.length();
int n = str2.length();
// Create a 2D ArrayList to store interleavings
ArrayList<ArrayList<ArrayList<String>>> dp = new ArrayList<>();
for (int i = 0; i <= m; i++) {
ArrayList<ArrayList<String>> row = new ArrayList<>();
dp.add(row);
for (int j = 0; j <= n; j++) {
row.add(new ArrayList<>());
}
}
// Base cases: If one of the strings is empty,
// return the other string
for (int i = 0; i <= m; i++) {
dp.get(i).get(0).add(str1.substring(0, i));
}
for (int j = 0; j <= n; j++) {
dp.get(0).get(j).add(str2.substring(0, j));
}
// Fill in the dynamic programming table
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
// Append the current character of str1 to
// each interleaved string from previous cells
for (String s : dp.get(i - 1).get(j)) {
dp.get(i).get(j).add(s + str1.charAt(i - 1));
}
// Append the current character of str2 to each
// interleaved string from previous cells
for (String s : dp.get(i).get(j - 1)) {
dp.get(i).get(j).add(s + str2.charAt(j - 1));
}
}
}
// Print all interleavings
for (String interleaved : dp.get(m).get(n)) {
System.out.println(interleaved);
}
}
// Example usage
public static void main(String[] args) {
String str1 = "AB";
String str2 = "CD";
printInterleavings(str1, str2);
}
}
Python
def printInterleavings(str1, str2):
m, n = len(str1), len(str2)
dp = [[[] for _ in range(n+1)] for _ in range(m+1)]
# Base cases: If one of the strings is empty, return the
# other string
for i in range(m+1):
dp[i][0] = [str1[:i]]
for j in range(n+1):
dp[0][j] = [str2[:j]]
# Fill in the dynamic programming table
for i in range(1, m+1):
for j in range(1, n+1):
# Append the current character of str1 to each
# interleaved string from previous cells
dp[i][j] += [s + str1[i-1] for s in dp[i-1][j]]
# Append the current character of str2 to each
# interleaved string from previous cells
dp[i][j] += [s + str2[j-1] for s in dp[i][j-1]]
# Print all interleavings
for interleaved in dp[m][n]:
print(interleaved)
# Example usage
str1 = "AB"
str2 = "CD"
printInterleavings(str1, str2)
C#
using System;
using System.Collections.Generic;
public class GFG
{
// Function to print interleavings of two strings
static void PrintInterleavings(string str1, string str2)
{
int m = str1.Length;
int n = str2.Length;
// Create a 2D vector to store interleavings
List<List<List<string>>> dp = new List<List<List<string>>>();
for (int i = 0; i <= m; i++)
{
List<List<string>> row = new List<List<string>>();
dp.Add(row);
for (int j = 0; j <= n; j++)
{
row.Add(new List<string>());
}
}
// Base cases: If one of the strings is empty,
// return the other string
for (int i = 0; i <= m; i++)
{
dp[i][0].Add(str1.Substring(0, i));
}
for (int j = 0; j <= n; j++)
{
dp[0][j].Add(str2.Substring(0, j));
}
// Fill in the dynamic programming table
for (int i = 1; i <= m; i++)
{
for (int j = 1; j <= n; j++)
{
// Append the current character of str1 to
// each interleaved string from previous cells
foreach (string s in dp[i - 1][j])
{
dp[i][j].Add(s + str1[i - 1]);
}
// Append the current character of str2 to each
// interleaved string from previous cells
foreach (string s in dp[i][j - 1])
{
dp[i][j].Add(s + str2[j - 1]);
}
}
}
// Print all interleavings
foreach (string interleaved in dp[m][n])
{
Console.WriteLine(interleaved);
}
}
// Example usage
public static void Main(string[] args)
{
string str1 = "AB";
string str2 = "CD";
PrintInterleavings(str1, str2);
}
}
JavaScript
function printInterleavings(str1, str2) {
const m = str1.length;
const n = str2.length;
const dp = new Array(m + 1).fill(null).map(() =>
new Array(n + 1));
// Base cases: If one of the strings is empty,
// return the other string
for (let i = 0; i <= m; i++) {
dp[i][0] = [str1.slice(0, i)];
}
for (let j = 0; j <= n; j++) {
dp[0][j] = [str2.slice(0, j)];
}
// Fill in the dynamic programming table
for (let i = 1; i <= m; i++) {
for (let j = 1; j <= n; j++) {
// Append the current character of str1 to
// each interleaved string from previous cells
dp[i][j] = dp[i - 1][j].map(s => s + str1[i - 1]);
// Append the current character of str2 to each
// interleaved string from previous cells
dp[i][j] = dp[i][j] || [];
dp[i][j].push(...dp[i][j - 1].map(s => s + str2[j - 1]));
}
}
// Print all interleavings
for (const interleaved of dp[m][n]) {
console.log(interleaved);
}
}
// Example usage
const str1 = "AB";
const str2 = "CD";
printInterleavings(str1, str2);
// THIS CODE IS CONTRIBUTED BY YASH AGARWAL(YASHAGARWAL2852002)
OutputCDAB
CADB
ACDB
CABD
ACBD
ABCD
Time complexity: O(m * n * L), where m and n are the lengths of str1 and str2 respectively, and L is the average length of the interleaved strings.
Auxiliary Space: O(m * n * L), where m and n are the lengths of str1 and str2 respectively, and L is the average length of the interleaved strings.
Similar Reads
Check if a String is Interleaving of Other Two
Give three strings s1, s2 and s3, determine if s3 is formed by interleaving s1 and s2.A string s3 is an interleaving of s1 and s2 if:It contains all characters of s1 and s2 while preserving their relative order.Characters from s1 and s2 appear in s3 in the same order as in their original strings.The
15+ min read
Interleaving of two given strings with no common characters
Given three strings s1, s2 and s3. check whether s3 is an interleaving of s1 and s2. It may be assumed that there is no common character between s1 and s2 A string s3 is said to be interleaving s1 and s2, if it contains all characters of s1 and s2 and order of all characters in individual strings is
10 min read
Merge two strings in chunks of given size
Given two strings 'a' and 'b' and a number k, our aim is to merge the strings into a string s such that it contains groups of k characters from the strings alternately in the final string. Examples: Input: a = "durability", b = "essence k = 3 Output: duressabienclitey Input: a = "determination" b =
9 min read
Print string of odd length in 'X' format
Given a string of odd length, print the string X format.Examples : Input: 12345 Output: 1 5 2 4 3 2 4 1 5 Input: geeksforgeeks Output: g s e k e e k e s g f r o f r s g k e e e e k g s We strongly recommend you to minimize your browser and try this yourself first.The idea is to use two variables in
15 min read
Print all Substrings of length n possible from the given String
Given a string str and an integer N, the task is to print all possible sub-strings of length N. Examples: Input: str = âgeeksforgeeksâ, N = 3Output: gee eek eks ksf sfo for org rge gee eek eksExplanations: All possible sub-strings of length 3 are âgeeâ, âeekâ, âeksâ, âksfâ, âsfoâ, âforâ, âorgâ, ârge
8 min read
Print all funny words in a string
We are given a sentence. Our task is to print all funny words/strings in that sentence. What is a funny word ? Reverse the given string. Iterate through each character of that string, compare the absolute difference in the ASCII values of the characters at positions 0 and 1, 1 and 2, 2 and 3 and so
5 min read
Interchanging first and second halves of strings
Given two strings a and b . Create two new strings by exchanging the first half and second half of one of the strings with the first half and second half of the other string respectively. Examples: Input : fighter warrior Output :warhter figrior Input :remuneration day Output :dration remuneay In th
5 min read
Final string after performing given operations
Given a string str containing only characters x and y, the task is to perform the following operations while possible: Find an index such that s[i] = 'x' and s[i+1] = 'y' and delete both the characters s[i] and s[i+1], if no such index is found then find an index such that s[i] = 'y' and s[i+1] = 'x
6 min read
Length of longest prefix anagram which are common in given two strings
Given two strings str1 and str2 of the lengths of N and M respectively, the task is to find the length of the longest anagram string that is prefix substring of both strings. Examples: Input: str1 = "abaabcdezzwer", str2 = "caaabbttyh"Output: 6Explanation: Prefixes of length 1 of string str1 and str
8 min read
Print all permutations of a string in Java
Given a string str, the task is to print all the permutations of str. A permutation is an arrangement of all or part of a set of objects, with regard to the order of the arrangement. For instance, the words âbatâ and âtabâ represents two distinct permutation (or arrangements) of a similar three lett
3 min read