📅  最后修改于: 2023-12-03 15:36:26.063000             🧑  作者: Mango
给定一个字符串,我们需要通过删除某些字符来使它的所有剩余字符都相同。找到所需的最小删除次数。
示例:
输入:"abaab"
输出:2
解释:一种最佳的方法是删除字符串中的 "a",结果字符串变为 "bbb"。
输入:"bbbbb"
输出:0
解释:字符串已经是所有字符都相同的状态,不需要删除任何字符。
输入:"aaaaa"
输出:0
解释:字符串已经是所有字符都相同的状态,不需要删除任何字符。
输入:"example"
输出:4
解释:需要删除 "x", "m", "p" 和 "l" 这四个字符来使剩下的字符都相同。
思路:将字符串中出现次数最多字符的个数与字符串长度比较,如果相等,则说明所有字符都相同,无需删除,返回 0;否则,需要删除的最小次数为字符串长度减去出现次数最多字符的个数。
Python:
class Solution:
def minDeletions(self, s: str) -> int:
count = collections.Counter(s)
maxCount = max(count.values())
if maxCount == 1:
return 0
delCount = len(s) - maxCount
if delCount >= maxCount:
return 0
freq = collections.Counter(count.values())
for k in range(2, maxCount + 1):
if k not in freq:
continue
v = freq[k]
if delCount >= v * (k - 1):
delCount -= v * (k - 1)
else:
return delCount // (k - 1) + sum(i for i in range(1, k) if (delCount % (k - 1)) >= i)
return delCount
Java:
class Solution {
public int minDeletions(String s) {
int[] count = new int[26];
for (int i = 0; i < s.length(); i++) {
count[s.charAt(i) - 'a']++;
}
Arrays.sort(count);
int delCount = 0;
for (int i = 24; i >= 0; i--) {
if (count[i] == 0) {
break;
}
if (count[i] == count[i + 1]) {
delCount++;
count[i]--;
i++;
} else if (count[i] > count[i + 1]) {
delCount += count[i] - count[i + 1];
count[i] = count[i + 1];
}
}
return delCount;
}
}
本题解提供了两种语言(Python 和 Java)的实现方法,其中 Python 代码使用了 Python 中的 collections.Counter 类,可以很方便地统计每个字符出现的次数;Java 代码则使用了简单的数组实现,遍历字符串计数,然后排序并统计需要删除的最小次数。在本题解的实现方法中,Python 思路清晰,代码简短,适合快速调试;而 Java 代码实现相对复杂,但是性能更高,适合生产环境下使用。