Sort the Array of Strings on the basis of given substring range

Given two positive integers I and X and an array of strings arr[], the task is to sort the given array of strings on the basis of susbtrings starting from index I of size X.

Examples:

Input: I = 2, X = 2, arr[] = { “baqwer”, “zacaeaz”, “aaqzzaa”, “aacaap”, “abbatyo”, “bbbacztr”, “bbbdaaa” }
Output: abbatyo bbbacztr bbbdaaa aacaap zacaeaz baqwer aaqzzaa
Explanation:
All sub-strings starting from index I = 2 and of size x = 2 are {“qw”, “ca”, “qz”, “ca”, “ba”, “ba”, “bd”}.
Sorting them in lexicographical increasing order gives {“ba”, “ba”, “bd”, “ca”, “ca”, “qw”, “qz” }, then print the corresponding original string in this order.

Input: I = 1, X = 3, arr[] = { “submit”, “source”, “skills”, “epidemic”, “ample”, “apple” }
Output: submit epidemic skills ample apple source

Approach: The idea is to create a substring of all the strings in the given array from index I of size X and keep the count of pair of a substring with the corresponding string in a map of pairs. After inserting in the map of pairs. After inserting, traverse the map and print the string.



Below is the implementation of the above approach:

CPP

filter_none

edit
close

play_arrow

link
brightness_4
code

// C++ program for the above approach
#include <bits/stdc++.h>
using namespace std;
  
// Function to sort the given array
// of strings based on substring
void sortArray(vector<string> s,
               int l, int x)
{
    // Map of pairs to sort vector
    // of strings
    map<pair<string, string>, int> mp;
  
    for (int i = 0; i < s.size(); i++) {
  
        // Create substring from index
        // 'l' and of size 'X'
        string part = s[i].substr(l, x);
  
        // Insert in Map
        mp[{ part, s[i] }] += 1;
    }
  
    // Print the sorted vector of strings
    for (auto it = mp.begin();
         it != mp.end(); ++it) {
  
        // Traverse the number of time
        // a string is present
        for (int j = 0; j < it->second; j++) {
  
            // Print the string
            cout << it->first.second << ' ';
        }
    }
}
  
// Driver Code
int main()
{
    // Given array of strings
    vector<string> arr;
    arr = { "baqwer", "zacaeaz", "aaqzzaa",
            "aacaap", "abbatyo", "bbbacztr",
            "bbbdaaa" };
  
    // Given I and X
    int I = 2, X = 2;
  
    // Function Call
    sortArray(arr, I, X);
    return 0;
}

chevron_right


Output:

abbatyo bbbacztr bbbdaaa aacaap zacaeaz baqwer aaqzzaa


Time Complexity: O(N*log N)
Auxiliary Space: O(N)

Attention reader! Don’t stop learning now. Get hold of all the important DSA concepts with the DSA Self Paced Course at a student-friendly price and become industry ready.




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.