GeeksforGeeks App
Open App
Browser
Continue

Python3 Program for Check if given string can be formed by two other strings or their permutations

Given a string str and an array of strings arr[], the task is to check if the given string can be formed by any of the string pair from the array or their permutations.
Examples:

Input: str = “amazon”, arr[] = {“loa”, “azo”, “ft”, “amn”, “lka”}
Output: Yes The chosen strings are “amn” and “azo” which can be rearranged as “amazon”.

Input: str = “geeksforgeeks”, arr[] = {“geeks”, “geek”, “for”}
Output: No

Method 1: In this approach, we begin by sorting the given string, then we run two nested loops to select two strings from the given array at a time and concatenate them. Then we sort the resultant string which we got after concatenation.
We then compare this string with the given string and check if they are equal or not. If found equal we return true.

Below is the implementation of the above approach:

Python3

 `# Python3 implementation of the approach` `# Function that returns true if str can be``# generated from any permutation of the``# two strings selected from the given vector``def` `isPossible(v, string ) :``    ` `    ``char_list ``=` `list``(string)``    ` `    ``# Sort the given string``    ``char_list.sort()``    ` `    ``# Select two strings at a time from given vector``    ``for` `i ``in` `range``(``len``(v)``-``1``) :``        ``for` `j ``in` `range``(``len``(v)) :``            ` `            ``# Get the concatenated string``            ``temp ``=` `v[i] ``+` `v[j];``            ` `            ``# Sort the resultant string``            ``temp_list ``=` `list``(temp)``            ``temp_list.sort()``            ` `            ``# If the resultant string is equal``            ``# to the given string str``            ``if` `(temp_list ``=``=` `char_list) :``                ``return` `True``;``                ` `    ``# No valid pair found``    ``return` `False``;` `# Driver code``if` `__name__ ``=``=` `"__main__"` `:` `    ``string ``=` `"amazon"``;``    ``v ``=` `[ ``"fds"``, ``"oxq"``, ``"zoa"``, ``"epw"``, ``"amn"` `];` `    ``if` `(isPossible(v, string)):``        ``print``(``"Yes"``);``    ``else` `:``        ``print``(``"No"``);``        ` `# This code is contributed by AnkitRai01`

Output

`Yes`

Time complexity: O(nlogn+m2klogk) where n is the size of the given string, m is the size of the given array, and k is the maximum size obtained by adding any two strings (which is basically the sum of the size of the two longest strings in the given array).

Space Complexity: O(n) as char_list and temp_list are created.

Method 2: Counting sort can be used to reduce the running time of the above approach. Counting sort uses a table to store the count of each character. We have 26 alphabets hence we make an array of size 26 to store counts of each character in the string. Then take the characters in increasing order to get the sorted string. Below is the implementation of the above approach:

Python3

 `# Python 3 implementation of the approach``MAX` `=` `26` `# Function to sort the given string``# using counting sort``def` `countingsort(s):``    ``# Array to store the count of each character``    ``count ``=` `[``0` `for` `i ``in` `range``(``MAX``)]``    ``for` `i ``in` `range``(``len``(s)):``        ``count[``ord``(s[i]) ``-` `ord``(``'a'``)] ``+``=` `1``    ``index ``=` `0` `    ``# Insert characters in the string``    ``# in increasing order``    ` `    ``for` `i ``in` `range``(``MAX``):``        ``j ``=` `0``        ``while` `(j < count[i]):``            ``s ``=` `s.replace(s[index],``chr``(``97``+``i))``            ``index ``+``=` `1``            ``j ``+``=` `1``        `  `# Function that returns true if str can be``# generated from any permutation of the``# two strings selected from the given vector``def` `isPossible(v, str1):``    ``# Sort the given string``    ``countingsort(str1);` `    ``# Select two strings at a time from given vector``    ``for` `i ``in` `range``(``len``(v)``-``1``):``        ``for` `j ``in` `range``(i ``+` `1``,``len``(v),``1``):``            ``# Get the concatenated string``            ``temp ``=` `v[i] ``+` `v[j]` `            ``# Sort the resultant string``            ``countingsort(temp)` `            ``# If the resultant string is equal``            ``# to the given string str``            ``if` `(temp ``=``=` `str1):``                ``return` `False``            ` `    ``# No valid pair found``    ``return` `True` `# Driver code``if` `__name__ ``=``=` `'__main__'``:``    ``str1 ``=` `"amazon"``    ``v ``=` `[``"fds"``, ``"oxq"``, ``"zoa"``, ``"epw"``, ``"amn"``]` `    ``if` `(isPossible(v, str1)):``        ``print``(``"Yes"``)``    ``else``:``        ``print``(``"No"``)` `# This code is contributed by``# Surendra_Gangwar`

Output

`Yes`

Time complexity: O(n+m2k) where n is the size of the given string, m is the size of the given array, and k is the maximum size obtained by adding any two strings (which is basically the sum of the size of the two longest strings in the given array).

Auxiliary Space: O(x) where x is the maximum length of two input strings after concatenating

Please refer complete article on Check if given string can be formed by two other strings or their permutations for more details!

My Personal Notes arrow_drop_up