📅  最后修改于: 2023-12-03 15:11:07.893000             🧑  作者: Mango
给定一个字符串,需要将其中不同连续字符的子序列都清空,即将这些子序列都删除,使得剩下的字符串中不存在不同连续字符的子序列。求清空这些子序列所需的最小删除次数。
例如,对于字符串 "ababbaca",需要清空的子序列为 "ab","ba","ca",共需要删除四个字符,即返回值为 4。
一个自然的想法是对所有的子序列进行枚举,然后检查是否是不同连续字符的子序列,如果是,则将其清空。这种算法的时间复杂度为 $O(n^3)$,无法通过本题。
从左到右遍历字符串,维护当前段连续字符开始的位置以及上一个字符的信息,如果下一个字符与上一个字符相同,则继续扩展当前段,直到遇到一个不同的字符;否则清空当前段并对结果计数。这个算法的时间复杂度为 $O(n)$,可以通过本题。
代码实现:
def min_deletions(s: str) -> int:
pre_char, start_pos, res = '', 0, 0
for i in range(len(s)):
if s[i] != pre_char:
if i - start_pos > 1:
res += i - start_pos - 1
start_pos = i
pre_char = s[i]
if len(s) - start_pos > 1:
res += len(s) - start_pos - 1
return res
时间复杂度:$O(n)$
空间复杂度:$O(1)$
本题主要考察贪心算法的思想,对于每个连续片段,我们选择尽可能少地删除字符。此外,还需要注意处理字符串末尾的特殊情况。