📌  相关文章
📜  清空二进制字符串所需的连续相似字符的最小删除(1)

📅  最后修改于: 2023-12-03 15:11:07.855000             🧑  作者: Mango

清空二进制字符串所需的连续相似字符的最小删除

介绍

在二进制字符串中,可能会存在连续的相似字符。现在我们的任务是要让这个二进制字符串清空,同时最小化删除的字符数目。具体来说,我们需要删除所有相邻的相同字符,直到字符串为空。例如,给定二进制字符串 "11000101",我们可以先删除前两个 "11",得到 "000101",然后删除 "00",得到 "0101",最后删除 "01",得到空字符串 "",总共删除了 6 个字符。这是删除字符数目最小的方法。现在,请完成函数 minDeletions(s: str) -> int,其中 s 是一个二进制字符串,返回使得 s 清空所需的最小删除字符数目。

思路

题目要求删除连续相似字符,可以先遍历整个字符串,如果遇到相邻的相同字符,就将其标记为待删除。然后,我们要考虑要删除哪些字符,以使得删除字符数目最小。因为我们假设所有相同的字符都是相邻的,因此我们只需要统计每种字符出现次数最高的情况,需要删除的字符数目即为字符串长度减去这个最高值。

代码片段
def minDeletions(s: str) -> int:
    n = len(s)
    d = {}
    for c in s:
        if c not in d:
            d[c] = 1  # 如果字符第一次出现,在字典中添加它并把出现次数设为 1
        else:
            d[c] += 1  # 否则出现次数加 1
    max_freq = max(d.values())  # 找到出现次数最高的字符的次数
    return n - max_freq  # 字符串长度减去最高出现次数即为需要删除的字符数目
示例
assert minDeletions("11000101") == 6
assert minDeletions("10") == 0
assert minDeletions("111000") == 3