This approach involves using a frequency array to count the number of times each character appears. We then use a set to track frequencies that we have already seen, and decrement frequencies until they are unique.
Time Complexity: O(N), where N is the length of the string. Space Complexity: O(1) because the number of unique characters is limited (26 lowercase English letters).
1import java.util.*;
2
3public class Solution {
4 public int minDeletions(String s) {
5 int[] freq = new int[26];
6 for (char ch : s.toCharArray()) {
7 freq[ch - 'a']++;
8 }
9 Set<Integer> used = new HashSet<>();
10 int deletions = 0;
11
12 for (int count : freq) {
13 while (count > 0 && !used.add(count)) {
14 count--;
15 deletions++;
16 }
17 }
18 return deletions;
19 }
20}
This Java solution calculates character frequencies using an integer array. It checks each frequency to see if it is unique using a HashSet. If not unique, it decrements the frequency until it becomes unique, counting each decrement as a deletion.
This approach uses a priority queue (or max heap) to manage frequencies, adjusting each frequency to maintain uniqueness from the highest to the lowest.
Time Complexity: O(N log N) due to priority queue operations. Space Complexity: O(1), constrained space regarding character set size.
1#include <iostream>
2#include <vector>
3#include <queue>
4#include <algorithm>
5
6int minDeletions(std::string s) {
7 std::vector<int> freq(26, 0);
8 for (char ch : s) {
9 freq[ch - 'a']++;
10 }
11
12 std::priority_queue<int> pq;
13 for (int f : freq) {
14 if (f > 0) pq.push(f);
15 }
16
17 int deletions = 0;
18 while (pq.size() > 1) {
19 int top = pq.top(); pq.pop();
20 if (top == pq.top()) {
21 if (top - 1 > 0) pq.push(top - 1);
22 deletions++;
23 }
24 }
25 return deletions;
26}
In this C++ solution, we first compute frequency counts in a vector. We then use a priority queue to keep higher frequencies at the top. When consecutive top elements (frequencies) are the same, we decrement and push back to keep them unique, counting deletions.