# 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
abde
dabe

## Recommended: Please try your approach on {IDE} first, before moving on to the solution.

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

 `// C++ implementation of the approach ` `#include ` `using` `namespace` `std; ` ` `  `// Set to store strings ` `// and avoid duplicates ` `set 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::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

 `// Java implementation of the approach ` `import` `java.util.HashSet; ` ` `  `class` `GFG ` `{ ` ` `  `    ``// Set to store strings ` `    ``// and avoid duplicates ` `    ``static` `HashSet 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

 `# 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 `

## C#

 `// C# implementation of the approach ` `using` `System; ` `using` `System.Collections.Generic;  ` ` `  `class` `GFG ` `{ ` ` `  `    ``// Set to store strings ` `    ``// and avoid duplicates ` `    ``static` `HashSet 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[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 `

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.

Article Tags :
Practice Tags :

Be the First to upvote.

Please write to us at contribute@geeksforgeeks.org to report any issue with the above content.