Check if a given string can be formed by two other strings or their permutations


A string is a continuous stream of characters, numbers. It may even contain special characters. An string can be composed of multiple sub-strings, also referred by words.

A permutation of a string is another string composed of the same set of characters, possibly arranged in a different order. It can basically be considered as a reordering of the string letters. For instance, abcd and badc are the permutations of the same string.

Sample Examples

Example 1 : str : “Permutation”

arr : {“repuio”,”mat”, “mtatn”,”mutate”}

Output :Yes

The input string “Permutation” can be formed from the pair strings at index 0 and 2, that is “repuio” and “mtatn” which can be rearranged to form the equivalent string.

This problem can be solved by using the following two methods in C++ −

  • Using sorting

  • Using counting sort

Method 1: Using sorting

An input array of strings is provided. During each nested iteration of the string using for loops, a pair of strings is captured from the input array. The sorted version of the input string as well as the generated pair string is compared if its permutations evaluate to the same string.

Syntax

sort()

The sort() method in C++ is used to sort the given string ascending or descending orderely.

sort(str.begin() , str.end())

Parameters

str.begin() - The starting of the string.

str.end() - The end of the string.

Algorithm

  • Step 1 − An input string and an array of strings is accepted.

  • Step 2 − The string is initially sorted using the sort() method in C++.

  • Step 3 − A nested loop iteration of the string is performed, wherein pairs of strings are accessed at a single time, using the pointers i and j. Each time a loop for j begins at the index i and goes on until the length of the string. Both the strings at indices i and j are accessed together and concatenated.

  • Step 4 − The concatenated string is then sorted again using the sort() method.

  • Step 5 − The concatenated string and the input sorted string are then compared. If they are equivalent, true is returned. Else, if none of the pair matches, false is returned.

Example

The following C++ code snippet is used to take as input a sample string and an array of strings and find out if the sample string can be generated using any pair of strings from the array −

//including the required libraries
#include <bits/stdc++.h>
using namespace std;

//check if string can be formed by permutations of two strings
bool permutation( string str,vector<string> arr) {
   int size = arr.size();

   //sorting the given string
   sort(str.begin(), str.end());

   //extracting two strings at a time
   for (int i = 0; i < size - 1; i++) {
      for (int j = i + 1; j < size; j++) {

         //concatenate the pair of string
         string concat = arr[i] + arr[j];

         // Sort the resultant string
         sort(concat.begin(), concat.end());

         //comparing if the order of characters in both strings are same
         if (concat.compare(str) == 0) {

            //if equal
            return true;
         }
      }
   }

   //no such combination exists
   return false;
}
int main(){

   //declaring the input string
   string str = "tutorials";

   //array of strings
   vector<string> arr{ "trils", "outa", "ginc", "abc" };
   bool res = permutation(str,arr);
   if(res)
      cout << "Yes, the string can be formed by permutation of two other strings";
   else
      cout << "No, the string can't be formed by permutation of two other strings";
   return 0;
}

Output

Yes, the string can be formed by permutation of two other strings

Method 2: Using counting sort

An input array of strings and a sample string is provided. The sample string is sorted using count sort. During each nested iteration of the string using for loops, a pair of strings is captured from the input array. The concatenated string, then generated, is also sorted using counting sort. The string as well as the generated pair string is compared if its permutations evaluate to the same string.

Counting Sort

An array of size 26 characters can be maintained to store the frequency of occurrence of each character in the string. This is eventually followed by extracting the characters in increasing order in order to obtain a sorted string.

Algorithm

  • Step 1 − An input string and an array of strings is accepted.

  • Step 2 − The string is initially sorted using the counting sort algorithm.

  • Step 3 − A nested loop iteration of the string is performed, wherein pairs of strings are accessed at a single time, using the pointers i and j.

  • Step 4 − Each time a loop for j begins at the index i and goes on until the length of the string. Both the strings at indices i and j are accessed together and concatenated.

  • Step 5 − The concatenated string is then sorted again using the counting sort mechanism.

  • Step 6 − The concatenated string and the input sorted string are then compared. If they are equivalent, true is returned. Else, if none of the pair matches, false is returned.

Example

//including the required libraries
#include <bits/stdc++.h>
using namespace std;

// Function to sort the given string
// using counting sort
void countsort(string& str){

   //declaring the numbr of characters
   int numchar = 26;

   //string length
   int len = str.length();

   //initialise the count of array
   int count[numchar] = { 0 };

   //declaring an index param
   int idx = 0;

   //traversing the string
   for (int i = 0; i < len; i++) {
      char ch = str[i] ;
      count[ch - 'a']++;
   }

   //increasing order insertion
   for (int i = 0; i < numchar; i++) {
      int j = 0;
      for (j=0; j < count[i];j++) {
         str[idx] = i + 'a';
         idx++;
      }
   }
}

//check if string can be formed by permutations of two strings
bool permutation( string str,vector<string> arr){
   int size = arr.size();

   //sorting the given string
   countsort(str);

   //extracting two strings at a time
   for (int i = 0; i < size - 1; i++) {
      for (int j = i + 1; j < size; j++) {

         //concatenate the pair of string
         string concat = arr[i] + arr[j];

         // Sort the resultant string
         countsort(concat);

         //comparing if the order of characters in both strings are same
         if (concat.compare(str) == 0) {

            //if equal
            return true;
         }
      }
   }

   //no such combination exists
   return false;
}
int main(){

   //declaring the input string
   string str = "tutorials";

   //array of strings
   vector<string> arr{ "trils", "outa", "ginc", "abc" };
   printf("\nString 2:\n");
   for (int i = 0; i <4 ; i++){
      cout<<arr[i]<<endl;
   }
   bool res = permutation(str,arr);
   if(res)
      cout << "Yes, the string can be formed by permutation of two other strings";
   else
      cout << "No, the string can't be formed by permutation of two other strings";
   return 0;
}

Output

String 2:
trils
outa
ginc
abc
Yes, the string can be formed by permutation of two other strings

Conclusion

Since, the counting sort mechanism takes into role only the evaluation of the character array of a finite size, that is 26, the second approach is considered to be better than the first one. The second approach reduces the time complexity of a polynomial time approach to a nearly polynomial approximation.

Updated on: 15-Mar-2023

311 Views

Kickstart Your Career

Get certified by completing the course

Get Started
Advertisements