Generate a Number in Decreasing order of Frequencies of characters of a given String

• Difficulty Level : Medium
• Last Updated : 01 Oct, 2021

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 using namespace std; // Custom comparator for sortingbool comp(pair& p1,          pair& 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 accordinglystring sort(map& m){     // Declaring vector of pairs    vector > 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;         // Append each digit        out = out + to_string(k);    }     // Returning final result    return out;} // Function to generate and return// the required numberstring formString(string s){    // Stores the frequencies    map 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 Codeint main(){    int N = 4;     string Str = "akkzzz";     cout << formString(Str);     return 0;}

Python3

 # Python3 Program to implement# the above approach # Function to sort map# accordinglydef 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))     # Character with higher    # frequency appears first    a = dict(sorted(a.items(),                    reverse = True,                    key = lambda x : x))     # Traversing the Vector    for x in a:         # Get the possible digit        # from assigned value        k = ord(x) - ord('a') + 1         # Ensures k does        # not exceed 9        k = k % 10         # Append each digit        out = out + str(k)     # Returning final result    return out # Function to generate and return# the required numberdef 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 CodeN = 4Str = "akkzzz"print(formString(Str)) # This code is contributed by avanitrachhadiya2155
Output:
611

Time Complexity: O(NlogN)
Auxiliary Space: O(N)

My Personal Notes arrow_drop_up