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 string 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:

CPP

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}

chevron_right


Java

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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

chevron_right


Python3

filter_none

edit
close

play_arrow

link
brightness_4
code

# Python3 implementation of the approach
  
# Set to store strings
# and aduplicates
stringSet=dict()
  
# Recursive function to generate the required strings
def find_permutation( str1,str2,len1,len2,i,j,res):
    # If currentis 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

chevron_right


Output:

aaab
aaba
abaa


My Personal Notes arrow_drop_up

Check out this Author's contributed articles.

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.