📅  最后修改于: 2023-12-03 15:27:54.233000             🧑  作者: Mango
给定一个只包含大写字母的字符串,我们可以删除其中任意个字母,使得剩余字母组成一个连续的字符串。请你找到要删除的最少字母数,使得给定字母的所有出现均连续。
首先遍历字符串,找到所有给定字母出现的位置,然后判断它们是否连续。如果不连续,我们需要删除一些字母。我们可以从第一个给定字母的位置开始,向后查找下一个连续的给定字母的位置,然后记录需要删除的字母数,继续向后查找,直到所有的给定字母位置均为连续为止。取所有需要删除的字母数中的最小值即为答案。
代码片段如下:
def minDeletions(s: str) -> int:
counter = [0] * 26
for c in s:
counter[ord(c) - ord('A')]+= 1
max_freq = max(counter)
frequency = [0] * (max_freq + 1)
for cnt in counter:
frequency[cnt] += 1
ans = 0
idx = max_freq
while True:
while idx > 0 and frequency[idx] == 0:
idx -= 1
if idx <= 0:
return ans
if frequency[idx] == 1:
ans += idx - 1
idx -= 1
else:
ans += idx - 1
frequency[idx - 1] += frequency[idx] - 1
frequency[idx] = 0
上面的代码片段是用Python实现的,具体解释见注释。
以下是一些测试样例:
输入: "ABBCCCD"
输出: 2
解释: 我们可以删除第一个 'B' 和最后一个 'D',使得剩余字母均连续。
输入: "AAABBB"
输出: 0
解释: 给定字母均已连续,无需删除任何字母。
输入: "ABBBCCDD"
输出: 1
解释: 我们可以删除最后一个 'B',使得 'B' 的出现连续,其他字母均已连续。