📜  包含最多 X 个不同元音的 K 个长度子串的计数(1)

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

包含最多 X 个不同元音的 K 个长度子串的计数

在一个字符串中,找到包含最多X个不同元音的长度为K的子串的数量。

算法思路

本算法采用滑动窗口的思想,遍历整个字符串,在每次遍历到的位置,判断长度为K的子串是否包含不同的X个元音。如果包含,将其计入结果中,同时移动窗口。如果不满足条件,则同时移动左右指针,跳过当前位置。

代码实现
def countSubstrings(s: str, k: int, x: int) -> int:
    vowels = set(['a', 'e', 'i', 'o', 'u'])
    left = right = count = diff = 0
    window = set()
    while right < len(s):
        if s[right] in vowels:
            if s[right] not in window:
                diff += 1
            window.add(s[right])
        if right - left == k:
            if diff <= x:
                count += 1
            if s[left] in window:
                window.remove(s[left])
                if s[left] not in window:
                    diff -= 1
            left += 1
        right += 1
    return count
算法分析

本算法时间复杂度为O(n),其中n是字符串s的长度。在遍历字符串过程中,左右指针共同移动,因此时间复杂度为线性的。空间复杂度为O(k),其中k是给定的子串长度。需要维护一个长度为k的窗口,以及一个set存储不同的元音字符。因为元音字符的个数一般比较少,因此可以认为空间复杂度为常数级别。