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

• Last Updated : 28 Feb, 2023

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 substrings 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: skills ample source epidemic apple submit

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:

## C++

 `// C++ program for the above approach``#include ``using` `namespace` `std;` `// Function to sort the given array``// of strings based on substring``void` `sortArray(vector s,``               ``int` `l, ``int` `x)``{``    ``// Map of pairs to sort vector``    ``// of strings``    ``map, ``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 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;``}`

## Java

 `import` `java.util.*;` `public` `class` `Main {``    ``// Function to sort the given array``    ``// of strings based on substring``    ``static` `void` `sortArray(String[] s, ``int` `l, ``int` `x) {``        ``// Map of pairs to sort array of strings``        ``Map mp = ``new` `TreeMap<>();` `        ``for` `(``int` `i = ``0``; i < s.length; i++) {``            ``// Create substring from index 'l' and of size 'x'``            ``String part = s[i].substring(l, l + x);` `            ``// Insert in Map``            ``if` `(mp.containsKey(part + s[i])) {``                ``mp.put(part + s[i], mp.get(part + s[i]) + ``1``);``            ``} ``else` `{``                ``mp.put(part + s[i], ``1``);``            ``}``        ``}` `        ``// Print the sorted array of strings``        ``for` `(String key : mp.keySet()) {``            ``// Traverse the number of time a string is present``            ``for` `(``int` `j = ``0``; j < mp.get(key); j++) {``                ``// Print the string``                ``System.out.print(key.substring(x) + ``" "``);``            ``}``        ``}``    ``}` `    ``// Driver Code``    ``public` `static` `void` `main(String[] args) {``        ``// Given array of strings``        ``String[] arr = { ``"baqwer"``, ``"zacaeaz"``, ``"aaqzzaa"``,``                         ``"aacaap"``, ``"abbatyo"``, ``"bbbacztr"``,``                         ``"bbbdaaa"` `};` `        ``// Given I and X``        ``int` `I = ``2``, X = ``2``;` `        ``// Function Call``        ``sortArray(arr, I, X);``    ``}``}`

## Python3

 `# Python program for the above approach` `# Function to sort the given array``# of strings based on substring``def` `sortArray(s, l, x):``    ` `    ``# Map of pairs to sort vector``    ``# of strings``    ``mp ``=` `{}` `    ``for` `i ``in` `range``(``len``(s)):``        ` `        ``# Create substring from index``        ``# 'l' and of size 'X'``        ``part ``=` `s[i][l:l``+``x]` `        ``# Insert in Map``        ``if` `(part, s[i]) ``in` `mp:``            ``mp[(part, s[i])] ``+``=` `1``        ``else``:``            ``mp[(part, s[i])] ``=` `1` `    ``# Print the sorted vector of strings``    ``for` `key, value ``in` `sorted``(mp.items()):``        ` `        ``# Traverse the number of time``        ``# a string is present``        ``for` `j ``in` `range``(value):``            ` `            ``# Print the string``            ``print``(key[``1``], end``=``" "``)` `# Driver Code``if` `__name__ ``=``=` `"__main__"``:``    ` `    ``# Given array of strings``    ``arr ``=` `[``"baqwer"``, ``"zacaeaz"``, ``"aaqzzaa"``,``           ``"aacaap"``, ``"abbatyo"``, ``"bbbacztr"``,``           ``"bbbdaaa"``]` `    ``# Given I and X``    ``I ``=` `2``    ``X ``=` `2` `    ``# Function Call``    ``sortArray(arr, I, X)`

## Javascript

 `// JavaScript code for the above approach``const sortArray = (s, l, x) => {``    ``// Map of pairs to sort array of strings``    ``let mp = ``new` `Map();` `    ``for` `(let i = 0; i < s.length; i++) {``        ``// Create substring from index 'l' and of size 'x'``        ``let part = s[i].substring(l, l + x);` `        ``// Insert in Map``        ``if` `(!mp.has(part + s[i])) {``            ``mp.set(part + s[i], 1);``        ``} ``else` `{``            ``mp.set(part + s[i], mp.get(part + s[i]) + 1);``        ``}``    ``}` `    ``// Print the sorted array of strings``    ``let sortedArray = Array.from(mp.keys()).sort();``    ``for` `(let i = 0; i < sortedArray.length; i++) {``        ``// Traverse the number of time a string is present``        ``for` `(let j = 0; j < mp.get(sortedArray[i]); j++) {``            ``// Print the string``            ``console.log(sortedArray[i].substring(x));``        ``}``    ``}``};` `// Given array of strings``let arr = [    ``"baqwer"``,    ``"zacaeaz"``,    ``"aaqzzaa"``,    ``"aacaap"``,    ``"abbatyo"``,    ``"bbbacztr"``,    ``"bbbdaaa"``,];` `// Given I and X``let I = 2,``    ``X = 2;` `// Function Call``sortArray(arr, I, X);`

Output:

`abbatyo bbbacztr bbbdaaa aacaap zacaeaz baqwer aaqzzaa`

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

My Personal Notes arrow_drop_up