# 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:124Explanation:

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:611Explanation:

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

Fork, 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 is611.

**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;` ` ` `// Append 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` ` ` `# Append 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` |

**Output:**

611

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