📅  最后修改于: 2023-12-03 15:22:47.639000             🧑  作者: Mango
在一个字符串中,找到包含最多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存储不同的元音字符。因为元音字符的个数一般比较少,因此可以认为空间复杂度为常数级别。