Write a function that gets a string as input and sorts the characters of the string by the increasing order of frequency(i.e., number of times it occurs) of its characters.
For Example:
If the string is "aaabbc",
c has frequency of 1
b has frequency of 2
a has frequency of 3
so, the output string should be "cbbaaa"
Method 1: (Hashing)
1. Create a hash table and initialize it to '0'
2. Parse the string and update the hash table & update the maximum count so far
3. Now, use two for loops to select count as 1,2,3,4.. max(maximum count) & another for hash table (0 to 26)
4. If the hashtable count matches the count, print the character for number of 'count' times using another for loop
Implementation:
#include <iostream>
#include<cstring>
#define MAX 100000 //Maximum size of character array
using namespace std;
//Function to return maximum value among two values
int getmax(int a,int b)
{
return a>b?a:b;
}
int main()
{
char str[MAX];
int T,hash[26];
cin>>T; //Number of Test cases
while(T--)
{
int max=0;
cin>>str; //Input string
//Creating a hash table and initializing it to '0' for each test case
for(int i=0;i<26;i++)
hash[i]=0;
for(int i=0;i<strlen(str);i++)
{
hash[str[i]-'a']++; //update the frequency of characters
max=getmax(max,hash[str[i]-'a']);//set max with maximum count so far
}
for(int j=1;j<=max;j++) //To check from 1 to max count
{
for(int i=0;i<26;i++) //To handle hash table values
{
if(hash[i]==j) /*If hash table value equals count, print the corresponding character count number of times.*/
{
char ch=i+'a';
for(int k=0;k<j;k++)
cout<<ch;
}
}
}
cout<<"\n";
}
return 0;
}