Given an array of strings arr[], consisting of N strings each representing dot separated numbers in the form of software versions.
Input: arr[] = {“1.1.2”, “0.9.1”, “1.1.0”} Output: “0.9.1” “1.1.0” “1.1.2” Input: arr[] = {“1.2”, “0.8.1”, “1.0”} Output: “0.8.1” “1.0” “1.2”
Approach: Follow the steps below to solve the problem:
- Create a function to compare two strings.
- Store strings into a vector.
- In order to compare two dot separated strings S1 and S2, iterate up to the length min(S1, S2) + 1 and compare each numerical parts of the string and sort accordingly.
- Repeat the above steps for each pair of string and sort the array accordingly.
Below is the implementation of above idea:
C++
// C++ Program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Compares two strings int check( const string& a, const string& b) { int al = a.length(); int bl = b.length(); int i = 0, j = 0; while (i < al && j < bl) { if (a[i] == b[j]) { ++i; ++j; } else if (a[i] > b[j]) { return 1; } else return -1; } if (i == al && j == bl) return 0; if (i == al) return -1; return 1; } // Function to split strings based on dots vector<string> getTokens( const string& a) { vector<string> v; string s; // Stringstream is used here for // tokenising the string based // on "." delimiter which might // contain unequal number of "."[dots] stringstream ss(a); while (getline(ss, s, '.' )) { v.push_back(s); } return v; } // Comparator to sort the array of strings bool comp( const string& a, const string& b) { // Stores the numerical substrings vector<string> va, vb; va = getTokens(a); vb = getTokens(b); // Iterate up to length of minimum // of the two strings for ( int i = 0; i < min(va.size(), vb.size()); i++) { // Compare each numerical substring // of the two strings int countCheck = check(va[i], vb[i]); if (countCheck == -1) return true ; else if (countCheck == 1) return false ; } if (va.size() < vb.size()) return true ; return false ; } // Driver Code int main() { vector<string> s; s.push_back( "1.1.0" ); s.push_back( "1.2.1" ); s.push_back( "0.9.1" ); s.push_back( "1.3.4" ); s.push_back( "1.1.2" ); s.push_back( "1.1.2.2.3" ); s.push_back( "9.3" ); // Sort the strings using comparator sort(s.begin(), s.end(), comp); // Display the sorted order for ( int i = 0; i < s.size(); i++) { cout << s[i] << endl; } cout << endl; return 0; } |
Java
// Java Program to implement // the above approach import java.util.*; class comp implements Comparator<String> { // Compares two Strings static int check(String a, String b) { int al = a.length(); int bl = b.length(); int i = 0 , j = 0 ; while (i < al && j < bl) { if (a.charAt(i) == b.charAt(j)) { ++i; ++j; } else if (a.charAt(i) > b.charAt(j)) { return 1 ; } else return - 1 ; } if (i == al && j == bl) return 0 ; if (i == al) return - 1 ; return 1 ; } // Function to split Strings based on dots static String[] getTokens(String a) { return (a.split( "." )); } // Comparator to sort the array of Strings public int compare(String a, String b) { // Stores the numerical subStrings String[] va = getTokens(a); String[] vb = getTokens(b); // Iterate up to length of minimum // of the two Strings for ( int i = 0 ; i < Math.min(va.length, vb.length); i++) { // Compare each numerical subString // of the two Strings int countCheck = check(va[i], vb[i]); if (countCheck == - 1 ) return - 1 ; else if (countCheck == 1 ) return 1 ; } if (va.length < vb.length) return - 1 ; return 1 ; } } class GFG { // Driver Code public static void main(String[] args) { ArrayList<String> s = new ArrayList<String>(); s.add( "1.1.0" ); s.add( "1.2.1" ); s.add( "0.9.1" ); s.add( "1.3.4" ); s.add( "1.1.2" ); s.add( "1.1.2.2.3" ); s.add( "9.3" ); // Sort the Strings using comparator Collections.sort(s, new comp()); // Display the sorted order for ( int i = 0 ; i < s.size(); i++) { System.out.println(s.get(i)); } } } // This code is contributed by phasing17. |
Python3
# Python3 Program to implement # the above approach import functools # Compares two strings def check(a, b): al = len (a); bl = len (b); i = 0 j = 0 ; while (i < al and j < bl) : if (a[i] = = b[j]) : i + = 1 ; j + = 1 ; elif (a[i] > b[j]): return 1 ; else : return - 1 ; if (i = = al and j = = bl): return 0 ; if (i = = al): return - 1 ; return 1 ; # Function to split strings based on dots def getTokens(a): v = [] # Stringstream is used here for # tokenising the string based # on "." delimiter which might # contain unequal number of "."[dots] ss = a.split( '.' ); for s in ss: v.append(s); return v; # Comparator to sort the array of strings def comp(a, b): # Stores the numerical substrings va = [] vb = []; va = getTokens(a); vb = getTokens(b); # Iterate up to length of minimum # of the two strings for i in range ( min ( len (va), len (vb))): # Compare each numerical substring # of the two strings countCheck = check(va[i], vb[i]); if (countCheck = = - 1 ): return False ; elif (countCheck = = 1 ): return True ; if len (va) < len (vb): return False ; return True ; # Driver Code s = []; s.append( "1.1.0" ); s.append( "1.2.1" ); s.append( "0.9.1" ); s.append( "1.3.4" ); s.append( "1.1.2" ); s.append( "1.1.2.2.3" ); s.append( "9.3" ); # Sort the strings using comparator s.sort(key = functools.cmp_to_key(comp)); # Display the sorted order print ( * s, sep = '\n' ) # This code is contributed by phasing17 |
C#
// C# Program to implement // the above approach using System; using System.Collections.Generic; public class comp : IComparer< string > { // Compares two strings static int check( string a, string b) { int al = a.Length; int bl = b.Length; int i = 0, j = 0; while (i < al && j < bl) { if (a[i] == b[j]) { ++i; ++j; } else if (a[i] > b[j]) { return 1; } else return -1; } if (i == al && j == bl) return 0; if (i == al) return -1; return 1; } // Function to split strings based on dots static List < string > getTokens( string a) { List< string > v = new List< string >(a.Split( '.' )); return v; } // Comparator to sort the array of strings public int Compare( string a, string b) { // Stores the numerical substrings List< string > va, vb; va = getTokens(a); vb = getTokens(b); // Iterate up to length of minimum // of the two strings for ( int i = 0; i < Math.Min(va.Count, vb.Count); i++) { // Compare each numerical substring // of the two strings int countCheck = check(va[i], vb[i]); if (countCheck == -1) return -1; else if (countCheck == 1) return 1; } if (va.Count < vb.Count) return -1; return 1; } } class GFG { // Driver Code public static void Main( string [] args) { List< string > s = new List< string >(); s.Add( "1.1.0" ); s.Add( "1.2.1" ); s.Add( "0.9.1" ); s.Add( "1.3.4" ); s.Add( "1.1.2" ); s.Add( "1.1.2.2.3" ); s.Add( "9.3" ); // Sort the strings using comparator s.Sort( new comp()); // Display the sorted order for ( int i = 0; i < s.Count; i++) { Console.WriteLine(s[i]); } } } // This code is contributed by phasing17. |
Javascript
// JS Program to implement // the above approach // Compares two strings function check(a, b) { let al = a.length; let bl = b.length; let i = 0, j = 0; while (i < al && j < bl) { if (a[i] == b[j]) { ++i; ++j; } else if (a[i] > b[j]) { return 1; } else return -1; } if (i == al && j == bl) return 0; if (i == al) return -1; return 1; } // Function to split strings based on dots function getTokens(a) { let v = [] // Stringstream is used here for // tokenising the string based // on "." delimiter which might // contain unequal number of "."[dots] let ss = a.split( '.' ); for (let s of ss) v.push(s); return v; } // Comparator to sort the array of strings function comp(a, b) { // Stores the numerical substrings let va = [], vb = []; va = getTokens(a); vb = getTokens(b); // Iterate up to length of minimum // of the two strings for ( var i = 0; i < Math.min(va.length, vb.length); i++) { // Compare each numerical substring // of the two strings let countCheck = check(va[i], vb[i]); if (countCheck == -1) return false ; else if (countCheck == 1) return true ; } if (va.length < vb.length) return false ; return true ; } // Driver Code let s = []; s.push( "1.1.0" ); s.push( "1.2.1" ); s.push( "0.9.1" ); s.push( "1.3.4" ); s.push( "1.1.2" ); s.push( "1.1.2.2.3" ); s.push( "9.3" ); // Sort the strings using comparator s.sort(comp); // Display the sorted order console.log(s.join( "\n" )) // This code is contributed by phasing17 |
0.9.1 1.1.0 1.1.2 1.1.2.2.3 1.2.1 1.3.4 9.3
Time complexity: O(n*log(n)*len) where n is the number of strings in the array and len is the length of longest string in the array
Auxiliary space: O(len)
Ready to dive in? Explore our Free Demo Content and join our DSA course, trusted by over 100,000 neveropen!