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

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: 



Below is the implementation of the above approach:
 

filter_none

edit
close

play_arrow

link
brightness_4
code

// 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;
}
chevron_right

filter_none

edit
close

play_arrow

link
brightness_4
code

# 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
chevron_right

Output: 
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.





Learn to Code A beginner in field of coding

If you like GeeksforGeeks and would like to contribute, you can also write an article using contribute.geeksforgeeks.org or mail your article to contribute@geeksforgeeks.org. See your article appearing on the GeeksforGeeks main page and help other Geeks.

Please Improve this article if you find anything incorrect by clicking on the "Improve Article" button below.



Improved By : avanitrachhadiya2155

Article Tags :
Practice Tags :