Given an array arr[] of integers, the task is to arrange the array elements such that the last digit of an element is equal to first digit of the next element.
Examples:
Input: arr[] = {123, 321}
Output: 123 321
Input: arr[] = {451, 378, 123, 1254}
Output: 1254 451 123 378
Naive approach: Find all the permutations of the array elements and then print the arranged array which meets the required condition. The time complexity of this approach is O(N!)
Efficient approach: Create a directed graph where there will be a directed edge from a node A to node B if the last digit of the number represented by Node A is equal to the first digit of the number represented by Node B. Now, find the Eulerian path for the graph formed. The complexity of the above algorithm is O(E * E) where E is the number of edges in the graph.
Below is the implementation of the above approach:
C++
// C++ implementation of the approach #include <bits/stdc++.h> using namespace std; // To store the array elements vector<string> arr; // Adjacency list for the graph nodes vector<vector< int > > graph; // To store the euler path vector<string> path; // Print eulerian path bool print_euler( int i, int visited[], int count) { // Mark node as visited // and increase the count visited[i] = 1; count++; // If all the nodes are visited // then we have traversed the euler path if (count == graph.size()) { path.push_back(arr[i]); return true ; } // Check if the node lies in euler path bool b = false ; // Traverse through remaining edges for ( int j = 0; j < graph[i].size(); j++) if (visited[graph[i][j]] == 0) { b |= print_euler(graph[i][j], visited, count); } // If the euler path is found if (b) { path.push_back(arr[i]); return true ; } // Else unmark the node else { visited[i] = 0; count--; return false ; } } // Function to create the graph and // print the required path void connect() { int n = arr.size(); graph.clear(); graph.resize(n); // Connect the nodes for ( int i = 0; i < n; i++) { for ( int j = 0; j < n; j++) { if (i == j) continue ; // If the last character matches with the // first character if (arr[i][arr[i].length() - 1] == arr[j][0]) { graph[i].push_back(j); } } } // Print the path for ( int i = 0; i < n; i++) { int visited[n] = { 0 }, count = 0; // If the euler path starts // from the ith node if (print_euler(i, visited, count)) break ; } // Print the euler path for ( int i = path.size() - 1; i >= 0; i--) { cout << path[i]; if (i != 0) cout << " " ; } } // Driver code int main() { arr.push_back( "451" ); arr.push_back( "378" ); arr.push_back( "123" ); arr.push_back( "1254" ); // Create graph and print the path connect(); return 0; } |
Python3
# Python3 implementation of the approach # Print eulerian path def print_euler(i, visited, count): # Mark node as visited # and increase the count visited[i] = 1 count + = 1 # If all the nodes are visited then # we have traversed the euler path if count = = len (graph): path.append(arr[i]) return True # Check if the node lies in euler path b = False # Traverse through remaining edges for j in range ( 0 , len (graph[i])): if visited[graph[i][j]] = = 0 : b | = print_euler(graph[i][j], visited, count) # If the euler path is found if b: path.append(arr[i]) return True # Else unmark the node else : visited[i] = 0 count - = 1 return False # Function to create the graph # and print the required path def connect(): n = len (arr) # Connect the nodes for i in range ( 0 , n): for j in range ( 0 , n): if i = = j: continue # If the last character matches # with the first character if arr[i][ - 1 ] = = arr[j][ 0 ]: graph[i].append(j) # Print the path for i in range ( 0 , n): visited = [ 0 ] * n count = 0 # If the euler path starts # from the ith node if print_euler(i, visited, count): break # Print the euler path for i in range ( len (path) - 1 , - 1 , - 1 ): print (path[i], end = "") if i ! = 0 : print ( " " , end = "") # Driver code if __name__ = = "__main__" : # To store the array elements arr = [] arr.append( "451" ) arr.append( "378" ) arr.append( "123" ) arr.append( "1254" ) # Adjacency list for the graph nodes graph = [[] for i in range ( len (arr))] # To store the euler path path = [] # Create graph and print the path connect() # This code is contributed by Rituraj Jain |
1254 451 123 378
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.