📜  从字符串中删除严格少于 K 次的字符(1)

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

从字符串中删除严格少于 K 次的字符

在某些场景下,我们需要从一个字符串中删除掉出现次数少于 K 次的字符。比如,我们需要处理一个股票信息文件,股票对应的代码可能跨越多行,为了简化处理流程,我们需要将出现次数较少的股票信息删除。这时,我们可以使用下列方法来实现。

方法一:使用哈希表统计字符出现次数
  • 定义一个哈希表 dict,用于记录字符串中每个字符出现的次数。
  • 遍历字符串,将字符作为 key,出现次数作为 value 加入哈希表中。
  • 再次遍历字符串,将出现次数小于 K 的字符替换为空字符。
  • 最后返回处理后的字符串。
def delete_infrequent_chars(s: str, K: int) -> str:
    char_count_dict = {}
    for char in s:
        if char in char_count_dict:
            char_count_dict[char] += 1
        else:
            char_count_dict[char] = 1

    res = []
    for char in s:
        if char_count_dict[char] >= K:
            res.append(char)

    return ''.join(res)

该方法的时间复杂度为 $O(n)$,其中 $n$ 为字符串长度。

方法二:使用计数排序统计字符出现次数
  • 定义一个计数器 counts,用于记录字符串中每个字符出现的次数。
  • 遍历字符串,使用 ord 函数将字符转换为对应的 ASCII 码,并使用计数器进行计数。
  • 再次遍历字符串,如果字符出现次数小于 K,则替换为空字符。
  • 最后返回处理后的字符串。
def delete_infrequent_chars(s: str, K: int) -> str:
    counts = [0] * 128
    for char in s:
        counts[ord(char)] += 1

    res = []
    for char in s:
        if counts[ord(char)] >= K:
            res.append(char)

    return ''.join(res)

该方法的时间复杂度为 $O(n)$,其中 $n$ 为字符串长度。如果字符串中字符集的大小为 $C$,则空间复杂度为 $O(C)$。

方法三:使用集合统计字符出现次数
  • 定义一个空集合 seen 和一个空列表 res。
  • 遍历字符串,如果字符出现次数小于 K,则将字符加入 seen 集合中,否则将字符加入 res 列表中。
  • 遍历 res 列表,如果字符已经出现在 seen 集合中,则将其删除,以保证 res 列表中的字符出现次数均不小于 K。
  • 最后拼接 res 列表中的字符返回处理后的字符串。
def delete_infrequent_chars(s: str, K: int) -> str:
    seen = set()
    res = []
    for char in s:
        if char not in seen:
            if s.count(char) < K:
                seen.add(char)
            else:
                res.append(char)

    return ''.join([c for c in res if c not in seen])

该方法的时间复杂度最差情况下为 $O(n^2)$,其中 $n$ 为字符串长度,但是在实际场景中效果可能会更好。空间复杂度为 $O(n)$,因为最坏情况下需要拷贝原字符串中的所有字符。