Given a string Str of length N, consisting of lowercase alphabets, the task is to generate a number in decreasing order of the frequency of characters in the given string. If two characters have the same frequency, the character with a smaller ASCII value appears first. Numbers assigned to characters {a, b, …., y, z} are {1, 2, …., 25, 26} respectively.
Note: For characters having values greater than 9 assigned to it, take its modulo 10.
Examples:
Input: N = 6, Str = “aaabbd”
Output: 124
Explanation:
Given characters and their respective frequencies are:
- a = 3
- b = 2
- d = 1
Since the number needs to be generated in increasing order of their frequencies, the final generated number is 124.
Input: N = 6, Str = “akkzzz”
Output: 611
Explanation:
Given characters and their respective frequencies are:
- a = 1
- k = 2
- z = 3
For z, value to assigned = 26
Hence, the corresponding digit assigned = 26 % 10 = 6
For k, value to assigned = 11
Hence, the corresponding digit assigned = 11 % 10 = 1
Since the number needs to be generated in increasing order of their frequencies, the final generated number is 611.
Approach:
Follow the steps below to solve the problem:
- Initialize a Map and store the frequencies of each character.
- Traverse the Map and insert all {Character, Frequency} pairs in a vector of pair.
- Sort this vector in a way such that the pair with higher frequency appears first and among pairs having the same frequency, those with smaller ASCII value come first.
- Traverse this vector and find the digit corresponding to each character.
- Print the final number generated.
Below is the implementation of the above approach:
C++
// C++ Program to implement // the above approach #include <bits/stdc++.h> using namespace std; // Custom comparator for sorting bool comp(pair< char , int >& p1, pair< char , int >& p2) { // If frequency is same if (p1.second == p2.second) // Character with lower ASCII // value appears first return p1.first < p2.first; // Otherwise character with higher // frequency appears first return p1.second > p2.second; } // Function to sort map accordingly string sort(map< char , int >& m) { // Declaring vector of pairs vector<pair< char , int > > a; // Output string to store the result string out; // Traversing map and pushing // pairs to vector for ( auto x : m) { a.push_back({ x.first, x.second }); } // Using custom comparator sort(a.begin(), a.end(), comp); // Traversing the Vector for ( auto x : a) { // Get the possible digit // from assigned value int k = x.first - 'a' + 1; // Ensures k does not exceed 9 k = k % 10; // Apppend each digit out = out + to_string(k); } // Returning final result return out; } // Function to generate and return // the required number string formString(string s) { // Stores the frequencies map< char , int > mp; for ( int i = 0; i < s.length(); i++) mp[s[i]]++; // Sort map in required order string res = sort(mp); // Return the final result return res; } // Driver Code int main() { int N = 4; string Str = "akkzzz" ; cout << formString(Str); return 0; } |
Python3
# Python3 Program to implement # the above approach # Function to sort map # accordingly def sort(m): # Declaring vector # of pairs a = {} # Output string to # store the result out = "" # Traversing map and # pushing pairs to vector for x in m: a[x] = [] a[x].append(m[x]) # Character with lower ASCII # value appears first a = dict ( sorted (a.items(), key = lambda x : x[ 0 ])) # Character with higher # frequency appears first a = dict ( sorted (a.items(), reverse = True , key = lambda x : x[ 1 ])) # Traversing the Vector for x in a: # Get the possible digit # from assigned value k = ord (x[ 0 ]) - ord ( 'a' ) + 1 # Ensures k does # not exceed 9 k = k % 10 # Apppend each digit out = out + str (k) # Returning final result return out # Function to generate and return # the required number def formString(s): # Stores the frequencies mp = {} for i in range ( len (s)): if s[i] in mp: mp[s[i]] + = 1 else : mp[s[i]] = 1 # Sort map in # required order res = sort(mp) # Return the # final result return res # Driver Code N = 4 Str = "akkzzz" print (formString( Str )) # This code is contributed by avanitrachhadiya2155 |
611
Time Complexity: O(NlogN)
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.