Medium
You are given a string word
and an integer k
.
We consider word
to be k-special if |freq(word[i]) - freq(word[j])| <= k
for all indices i
and j
in the string.
Here, freq(x)
denotes the frequency of the character x
in word
, and |y|
denotes the absolute value of y
.
Return the minimum number of characters you need to delete to make word
k-special.
Example 1:
Input: word = “aabcaba”, k = 0
Output: 3
Explanation: We can make word
0
-special by deleting 2
occurrences of "a"
and 1
occurrence of "c"
. Therefore, word
becomes equal to "baba"
where freq('a') == freq('b') == 2
.
Example 2:
Input: word = “dabdcbdcdcd”, k = 2
Output: 2
Explanation: We can make word
2
-special by deleting 1
occurrence of "a"
and 1
occurrence of "d"
. Therefore, word
becomes equal to “bdcbdcdcd” where freq('b') == 2
, freq('c') == 3
, and freq('d') == 4
.
Example 3:
Input: word = “aaabaaa”, k = 2
Output: 1
Explanation: We can make word
2
-special by deleting 1
occurrence of "b"
. Therefore, word
becomes equal to "aaaaaa"
where each letter’s frequency is now uniformly 6
.
Constraints:
1 <= word.length <= 105
0 <= k <= 105
word
consists only of lowercase English letters.public class Solution {
public int minimumDeletions(String word, int k) {
int[] arr = new int[26];
for (int i = 0; i < word.length(); i++) {
arr[word.charAt(i) - 'a']++;
}
int min = Integer.MAX_VALUE;
for (int value : arr) {
if (value != 0) {
int u = value + k;
int res = 0;
for (int i : arr) {
if (i < value) {
res += i;
} else if (i > u) {
res += (i - u);
}
}
min = Math.min(res, min);
}
}
return min;
}
}