Welcome to Subscribe On Youtube
3692. Majority Frequency Characters
Description
You are given a string s consisting of lowercase English letters.
The frequency group for a value k is the set of characters that appear exactly k times in s.
The majority frequency group is the frequency group that contains the largest number of distinct characters.
Return a string containing all characters in the majority frequency group, in any order. If two or more frequency groups tie for that largest size, pick the group whose frequency k is larger.
Example 1:
Input: s = "aaabbbccdddde"
Output: "ab"
Explanation:
| Frequency (k) | Distinct characters in group | Group size | Majority? |
|---|---|---|---|
| 4 | {d} | 1 | No |
| 3 | {a, b} | 2 | Yes |
| 2 | {c} | 1 | No |
| 1 | {e} | 1 | No |
Both characters 'a' and 'b' share the same frequency 3, they are in the majority frequency group. "ba" is also a valid answer.
Example 2:
Input: s = "abcd"
Output: "abcd"
Explanation:
| Frequency (k) | Distinct characters in group | Group size | Majority? |
|---|---|---|---|
| 1 | {a, b, c, d} | 4 | Yes |
All characters share the same frequency 1, they are all in the majority frequency group.
Example 3:
Input: s = "pfpfgi"
Output: "fp"
Explanation:
| Frequency (k) | Distinct characters in group | Group size | Majority? |
|---|---|---|---|
| 2 | {p, f} | 2 | Yes |
| 1 | {g, i} | 2 | No (tied size, lower frequency) |
Both characters 'p' and 'f' share the same frequency 2, they are in the majority frequency group. There is a tie in group size with frequency 1, but we pick the higher frequency: 2.
Constraints:
1 <= s.length <= 100sconsists only of lowercase English letters.
Solutions
Solution: Hash Table
We first use an array or hash table $\textit{cnt}$ to count the frequency of each character in the string. Then, we use another hash table $\textit{f}$ to group characters with the same frequency $k$ into the same list, i.e., $\textit{f}[k]$ stores all characters with frequency $k$.
Next, we iterate through the hash table $\textit{f}$ to find the frequency group with the maximum group size. If multiple frequency groups have the same maximum size, we choose the one with the larger frequency $k$. Finally, we concatenate all characters in that frequency group into a string and return it.
The time complexity is $O(n)$ and the space complexity is $O(n)$, where $n$ is the length of string $\textit{s}$.
-
class Solution { public String majorityFrequencyGroup(String s) { int[] cnt = new int[26]; for (char c : s.toCharArray()) { ++cnt[c - 'a']; } Map<Integer, StringBuilder> f = new HashMap<>(); for (int i = 0; i < cnt.length; ++i) { if (cnt[i] > 0) { f.computeIfAbsent(cnt[i], k -> new StringBuilder()).append((char) ('a' + i)); } } int mx = 0; int mv = 0; String ans = ""; for (var e : f.entrySet()) { int v = e.getKey(); var cs = e.getValue(); if (mx < cs.length() || (mx == cs.length() && mv < v)) { mx = cs.length(); mv = v; ans = cs.toString(); } } return ans; } } -
class Solution { public: string majorityFrequencyGroup(string s) { vector<int> cnt(26, 0); for (char c : s) { ++cnt[c - 'a']; } unordered_map<int, string> f; for (int i = 0; i < 26; ++i) { if (cnt[i] > 0) { f[cnt[i]].push_back('a' + i); } } int mx = 0, mv = 0; string ans; for (auto& e : f) { int v = e.first; string& cs = e.second; if (mx < (int) cs.size() || (mx == (int) cs.size() && mv < v)) { mx = cs.size(); mv = v; ans = cs; } } return ans; } }; -
class Solution: def majorityFrequencyGroup(self, s: str) -> str: cnt = Counter(s) f = defaultdict(list) for c, v in cnt.items(): f[v].append(c) mx = mv = 0 ans = [] for v, cs in f.items(): if mx < len(cs) or (mx == len(cs) and mv < v): mx = len(cs) mv = v ans = cs return "".join(ans) -
func majorityFrequencyGroup(s string) string { cnt := make([]int, 26) for _, c := range s { cnt[c-'a']++ } f := make(map[int][]byte) for i, v := range cnt { if v > 0 { f[v] = append(f[v], byte('a'+i)) } } mx, mv := 0, 0 var ans []byte for v, cs := range f { if len(cs) > mx || (len(cs) == mx && v > mv) { mx = len(cs) mv = v ans = cs } } return string(ans) } -
function majorityFrequencyGroup(s: string): string { const cnt: Record<string, number> = {}; for (const c of s) { cnt[c] = (cnt[c] || 0) + 1; } const f = new Map<number, string[]>(); for (const [c, v] of Object.entries(cnt)) { if (!f.has(v)) { f.set(v, []); } f.get(v)!.push(c); } let [mx, mv] = [0, 0]; let ans = ''; f.forEach((cs, v) => { if (mx < cs.length || (mx == cs.length && mv < v)) { mx = cs.length; mv = v; ans = cs.join(''); } }); return ans; }