Open In App

Distinct strings such that they contains given strings as sub-sequences

Given two strings str1 and str2 of lengths M and N respectively. The task is to find all the distinct strings of length M + N such that the frequency of any character in the resultant string is equal to the sum of frequencies of the same character in the given strings and both the given strings are present as a sub-sequence in all the generated strings.

Examples: 

Input: str = “aa”, str2 = “ab” 
Output: 
abaa 
aaab 
aaba
Input: str1 = “ab”, str2 = “de” 
Output: 
deab 
daeb 
adeb 
abde 
dabe 
adbe 

Approach: This problem can be solved using recursion. Set two pointers i and j to the beginnings of strings str1 and str2 respectively. Now, at every recursive call, we have two choices to select either the character at str1[i] or the character at str2[j] and the termination condition will be when the length of the resultant string becomes equal to len(str1) + len(str2). Use an unordered_set in order to avoid duplicates.

Below is the implementation of the above approach: 

// C++ implementation of the approach
#include <bits/stdc++.h>
using namespace std;
 
// Set to store strings
// and avoid duplicates
set<string> stringSet;
 
// Recursive function to generate the required strings
void find_permutation(string& str1, string& str2, int len1,
                      int len2, int i, int j, string res)
{
    // If current string is part of the result
    if (res.length() == len1 + len2) {
 
        // Insert it into the set
        stringSet.insert(res);
        return;
    }
 
    // If character from str1 can be chosen
    if (i < len1)
        find_permutation(str1, str2, len1, len2,
                         i + 1, j, res + str1[i]);
 
    // If character from str2 can be chosen
    if (j < len2)
        find_permutation(str1, str2, len1, len2,
                         i, j + 1, res + str2[j]);
}
 
// Function to print the generated
// strings from the set
void print_set()
{
    set<string>::iterator itr;
    for (itr = stringSet.begin(); itr != stringSet.end(); itr++)
        cout << (*itr) << endl;
}
 
// Driver code
int main()
{
    string str1 = "aa", str2 = "ab";
    int len1 = str1.length();
    int len2 = str2.length();
 
    find_permutation(str1, str2, len1,
                     len2, 0, 0, "");
    print_set();
 
    return 0;
}

                    
// Java implementation of the approach
import java.util.HashSet;
 
class GFG
{
 
    // Set to store strings
    // and avoid duplicates
    static HashSet<String> stringSet = new HashSet<>();
 
    // Recursive function to generate the required strings
    public static void find_permutation(String str1, String str2,
                                        int len1, int len2, int i,
                                        int j, String res)
    {
 
        // If current string is part of the result
        if (res.length() == len1 + len2)
        {
 
            // Insert it into the set
            stringSet.add(res);
            return;
        }
 
        // If character from str1 can be chosen
        if (i < len1)
            find_permutation(str1, str2, len1, len2, i + 1,
                                    j, res + str1.charAt(i));
 
        // If character from str2 can be chosen
        if (j < len2)
            find_permutation(str1, str2, len1, len2, i, j + 1,
                                           res + str2.charAt(j));
    }
 
    // Function to print the generated
    // strings from the set
    public static void print_set()
    {
        for (String s : stringSet)
            System.out.println(s);
    }
 
    // Driver code
    public static void main(String[] args)
    {
        String str1 = "aa", str2 = "ab";
        int len1 = str1.length();
        int len2 = str2.length();
 
        find_permutation(str1, str2, len1, len2, 0, 0, "");
 
        print_set();
    }
}
 
// This code is contributed by
// sanjeev2552

                    
# Python3 implementation of the approach
 
# Set to store strings
# and avoid duplicates
stringSet=dict()
 
# Recursive function to generate the required strings
def find_permutation( str1,str2,len1,len2,i,j,res):
    # If current string is part of the result
    if (len(res) == len1 + len2):
 
        # Insert it into the set
        stringSet[res]=1
        return
 
    # If character from str1 can be chosen
    if (i < len1):
        find_permutation(str1, str2, len1, len2,i + 1, j, res + str1[i])
 
    # If character from str2 can be chosen
    if (j < len2):
        find_permutation(str1, str2, len1, len2,i, j + 1, res + str2[j])
 
 
# Function to print the generated
# strings from the set
def print_set():
 
    for i in stringSet:
        print(i)
 
 
# Driver code
 
str1 = "aa"
str2 = "ab"
len1 = len(str1)
len2 = len(str2)
 
find_permutation(str1, str2, len1,len2, 0, 0, "")
print_set()
 
# This code is contributed by mohit kumar 29

                    
// C# implementation of the approach
using System;
using System.Collections.Generic;
 
class GFG
{
 
    // Set to store strings
    // and avoid duplicates
    static HashSet<String> stringSet = new HashSet<String>();
 
    // Recursive function to generate the required strings
    public static void find_permutation(String str1, String str2,
                                        int len1, int len2, int i,
                                        int j, String res)
    {
 
        // If current string is part of the result
        if (res.Length == len1 + len2)
        {
 
            // Insert it into the set
            stringSet.Add(res);
            return;
        }
 
        // If character from str1 can be chosen
        if (i < len1)
            find_permutation(str1, str2, len1, len2, 
                             i + 1, j, res + str1[i]);
 
        // If character from str2 can be chosen
        if (j < len2)
            find_permutation(str1, str2, len1, len2,
                             i, j + 1, res + str2[j]);
    }
 
    // Function to print the generated
    // strings from the set
    public static void print_set()
    {
        foreach (String s in stringSet)
            Console.WriteLine(s);
    }
 
    // Driver code
    public static void Main(String[] args)
    {
        String str1 = "aa", str2 = "ab";
        int len1 = str1.Length;
        int len2 = str2.Length;
 
        find_permutation(str1, str2,
                         len1, len2, 0, 0, "");
 
        print_set();
    }
}
 
// This code is contributed by 29AjayKumar

                    
<script>
// Javascript implementation of the approach
 
// Set to store strings
    // and avoid duplicates
let stringSet = new Set();
 
// Recursive function to generate the required strings
function find_permutation(str1,str2,len1,len2,i,j,res)
{
    // If current string is part of the result
        if (res.length == len1 + len2)
        {
   
            // Insert it into the set
            stringSet.add(res);
            return;
        }
   
        // If character from str1 can be chosen
        if (i < len1)
            find_permutation(str1, str2, len1, len2, i + 1,
                                    j, res + str1[i]);
   
        // If character from str2 can be chosen
        if (j < len2)
            find_permutation(str1, str2, len1, len2, i, j + 1,
                                           res + str2[j]);
}
 
// Function to print the generated
    // strings from the set
function print_set()
{
    for(let s of stringSet.values())
    {
        document.write(s+"<br>");
    }
}
 
// Driver code
let str1 = "aa", str2 = "ab";
let len1 = str1.length;
let len2 = str2.length;
 
find_permutation(str1, str2, len1, len2, 0, 0, "");
 
print_set();
 
 
 
// This code is contributed by unknown2108
</script>

                    

Output
aaab
aaba
abaa

Time complexity: O()
Auxiliary Space: O(length(str1)+length(str2))


Article Tags :