###### tags: `leetcode` `medium` `Hash Table` `String` `Sort` `Heap(Priority Queue)` `Bucket Sort` `Counting` # [451. Sort Characters By Frequency](https://leetcode.com/problems/sort-characters-by-frequency/) ## Description Given a string `s`, sort it in **decreasing order** based on the **frequency** of the characters. The **frequency** of a character is the number of times it appears in the string. Return *the sorted string*. If there are multiple answers, return *any of them*. ## Examples ### Example 1: **Input**: s = "tree" **Output**: "eert" **Explanation**: 'e' appears twice while 'r' and 't' both appear once. So 'e' must appear before both 'r' and 't'. Therefore "eetr" is also a valid answer. ### Example 2: **Input**: s = "cccaaa" **Output**: "aaaccc" **Explanation**: Both 'c' and 'a' appear three times, so both "cccaaa" and "aaaccc" are valid answers. Note that "cacaca" is incorrect, as the same characters must be together. ### Example 3: **Input**: s = "Aabb" **Output**: "bbAa" **Explanation**: "bbaA" is also a valid answer, but "Aabb" is incorrect. Note that 'A' and 'a' are treated as two different characters. ## Constraints: - $1 \leq s.length \leq 5 \times 10^5$ - `s` consists of uppercase and lowercase English letters and digits. ## Code ```c= typedef struct alph{ char c; int freq; }ALPH; int cmp(const void * a, const void * b){ return ((ALPH*)b)->freq - ((ALPH*)a)->freq; } char * frequencySort(char * s){ ALPH count[62] = {{'0', 0}}; char *result = calloc(strlen(s) + 1, sizeof(char)); // Initialize for(int i = 0 ; i < 26 ; i++) count[i].c = i + 'A'; for(int i = 26 ; i < 52 ; i++) count[i].c = i + 'a' - 26; for(int i = 52 ; i < 62 ; i++) count[i].c = i + '0' - 52; // Count frequency while(*s != '\0'){ if(*s >= 'a') count[*s++ - 'a' + 26].freq++; else if(*s >= 'A') count[*s++ - 'A'].freq++; else count[*s++ - '0' + 52].freq++; } // Sort alpabetics by frequency qsort(count, 62, sizeof(ALPH), cmp); // Assign character by frequency char *tmp = result; for(int i = 0 ; i < 62 ; i++){ for(int j = 0 ; j < count[i].freq ; j++) *tmp++ = count[i].c; } result[strlen(result)] = '\0'; return result; } ``` ## Complexity |Space |Time | |- |- | |$O(1)$|$O(Nlog(N))$| ## Result - Runtime: 7 ms, faster than 67.21% - Memory Usage: 6.8 MB, less than 26.23% ## Notes - ASCII code: - 0 : 43 - A : 65 - a : 97