Lexicographically smallest string obtained after concatenating array

07 Jul, 2022
Given n strings, concatenate them in an order that produces the lexicographically smallest possible string.Examples:  
Input :  a[] = ["c", "cb", "cba"]
Output : cbacbc
Possible strings are ccbcba, ccbacb, 
cbccba, cbcbac, cbacbc and cbaccb. 
Among all these strings, cbacbc is 
the lexicographically smallest.

Input :  a[] = ["aa", "ab", "aaa"]
Output : aaaaaab
 
One might think that sorting the given strings in the lexicographical order and then concatenating them produces the correct output. This approach produces the correct output for inputs like [“a”, “ab”, “abc”]. However, applying this method on [“c”, “cb”, “cba”] produces the wrong input and hence this approach is incorrect.The correct approach is to use a regular sorting algorithm. When two strings a and b are compared to decide if they have to be swapped or not, do not check if a is lexicographically smaller than b or not. Instead check if appending b at the end of a produces a lexicographically smaller string or appending a at the end of b does. This approach works because we want the concatenated string to be lexicographically small, not the individual strings to be in the lexicographical order.  
C++
Java
Python 3
C#
Javascript
// CPP code to find the lexicographically// smallest string#include <bits/stdc++.h>using namespace std; // Compares two strings by checking if// which of the two concatenations causes// lexicographically smaller string.bool compare(string a, string b){    return (a+b < b+a);} string lexSmallest(string a[], int n){    // Sort strings using above compare()    sort(a, a+n, compare);     // Concatenating sorted strings    string answer = "";    for (int i = 0; i < n; i++)        answer += a[i];     return answer;} // Driver codeint main(){    string a[] = { "c", "cb", "cba" };    int n = sizeof(a)/sizeof(a[0]);    cout << lexSmallest(a, n);    return 0;}
// Java code to find the lexicographically// smallest string class GFG {     // function to sort the// array of stringstatic void sort(String a[], int n){         //sort the array    for(int i = 0;i < n;i++)    {        for(int j = i + 1;j < n;j++)        {                         // comparing which of the            // two concatenation causes            // lexicographically smaller            // string            if((a[i] + a[j]).compareTo(a[j] + a[i]) > 0)            {                String s = a[i];                a[i] = a[j];                a[j] = s;            }        }    }}     static String lexsmallest(String a[], int n){         // Sort strings    sort(a,n);     // Concatenating sorted strings    String answer = "";    for (int i = 0; i < n; i++)        answer += a[i];     return answer;} // Driver codepublic static void main(String args[]){    String a[] = {"c", "cb", "cba"};    int n = 3;    System.out.println("lexicographically smallest string = "                                      + lexsmallest(a, n)); }} // This code is contributed by Arnab Kundu
# Python 3 code to find the lexicographically# smallest stringdef lexSmallest(a, n):  # Sort strings using above compare()  for i in range(0,n):    for j in range(i+1,n):      if(a[i]+a[j]>a[j]+a[i]):        s=a[i]        a[i]=a[j]        a[j]=s   # Concatenating sorted strings  answer = ""  for i in range( n):    answer += a[i]  return answer # Driver codeif __name__ == "__main__":         a = [ "c", "cb", "cba" ]    n = len(a)    print(lexSmallest(a, n)) # This code is contributed by vibhu karnwal     
// C# code to find// the lexicographically// smallest stringusing System; class GFG {     // function to sort the// array of stringstatic void sort(String []a, int n){         //sort the array    for(int i = 0;i < n;i++)    {        for(int j = i + 1;j < n;j++)        {                         // comparing which of the            // two concatenation causes            // lexicographically smaller            // string            if((a[i] + a[j]).CompareTo(a[j] +                                  a[i]) > 0)            {                String s = a[i];                a[i] = a[j];                a[j] = s;            }        }    }}     static String lexsmallest(String []a, int n){         // Sort strings    sort(a,n);     // Concatenating sorted    // strings    String answer = "";    for (int i = 0; i < n; i++)        answer += a[i];     return answer;} // Driver codepublic static void Main(){    String []a = {"c", "cb", "cba"};    int n = 3;    Console.Write("lexicographically smallest string = "                                 + lexsmallest(a, n)); }} // This code is contributed by nitin mittal
<script>// Javascript code to find the lexicographically// smallest string // function to sort the// array of stringfunction sort(a,n){     // sort the array    for(let i = 0;i < n;i++)    {        for(let j = i + 1;j < n;j++)        {                           // comparing which of the            // two concatenation causes            // lexicographically smaller            // string            if((a[i] + a[j])>(a[j] + a[i]) )            {                let s = a[i];                a[i] = a[j];                a[j] = s;            }        }    }}  function lexsmallest(a,n){    // Sort strings    sort(a,n);       // Concatenating sorted strings    let answer = "";    for (let i = 0; i < n; i++)        answer += a[i];       return answer;} // Driver codelet a=["c", "cb", "cba"];let n = 3;document.write("lexicographically smallest string = "                                      + lexsmallest(a, n));           // This code is contributed by rag2127</script>
cbacbc
 
Time complexity : The above code runs in O(M * N * logN) where N is number of strings and M is maximum length of a string.
Auxiliary Space: O(n)
This article is contributed by Aarti_Rathi. If you like GeeksforGeeks and would like to contribute, you can also write an article using write.geeksforgeeks.org or mail your article to review-team@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.Please write comments if you find anything incorrect, or you want to share more information about the topic discussed above.  
andrew1234
nitin mittal
ukasp
rag2127
vknwl077
akshaysingh98088
adi1212
lexicographic-ordering
Sorting
Strings
Strings
Sorting
Writing code in comment?
Please use ide.geeksforgeeks.org,
generate link and share the link here.
std::sort() in C++ STL
Time Complexities of all Sorting Algorithms
Merge two sorted arrays
Count Inversions in an array | Set 1 (Using Merge Sort)
Radix Sort
Write a program to reverse an array or string
Reverse a string in Java
Write a program to print all permutations of a given string
C++ Data Types
Check for Balanced Brackets in an expression (well-formedness) using Stack