📌  相关文章
📜  清空给定字符串所需的不同连续字符的子序列的最小删除(1)

📅  最后修改于: 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)$

总结

本题主要考察贪心算法的思想,对于每个连续片段,我们选择尽可能少地删除字符。此外,还需要注意处理字符串末尾的特殊情况。