1. Brute Force — Sort Characters Directly with Frequency Comparator
Intuition
Build a frequency table. Sort the array of characters where a comes before b if freq[a] > freq[b], breaking ties with character order.
When to apply: When simplicity is preferred for short strings.
Algorithm
- Step 1: Count frequency of each character in s using a hash map.
- Step 2: Convert s to a list of characters.
- Step 3: Sort list using custom comparator: freq[b] - freq[a].
- Step 4: Join characters and return.
#include <iostream>#include <string>#include <vector>#include <unordered_map>#include <algorithm>using namespace std; class Solution {public: string frequencySort(string s) { unordered_map<char, int> freq; for (char c : s) freq[c]++; sort(s.begin(), s.end(), [&](char a, char b) { if (freq[a] != freq[b]) return freq[a] > freq[b]; return a < b; }); return s; }}; int main() { Solution sol; cout << "Frequency Sort (Brute Force): " << sol.frequencySort("tree") << endl; return 0;}Time & Space Complexity
- Time complexity:
O(N log N)— O(N log N) sorting all characters. - Space complexity:
O(N)— O(N) for character array and frequency map.
Why Brute Force Doesn't Scale:
For N = 5 * 105, O(N log N) requires ~9.5 * 106 operations, whereas Bucket Sort takes ~5 * 105 operations.
Bucket sort runs in ~25ms on 500,000 characters.