- [Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II](#Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II)
- [1. 解题思路](#1. 解题思路)
- [2. 代码实现](#2. 代码实现)
1. 解题思路
这一题的话思路上就是一个滑动窗口,考察没一个点作为起始位置时,满足同时包含5个元音字符以及恰好 k k k个辅音字符的第一个位置,然后从该位置到其下一个辅音字符之间的任意一个位置都可以构成一个满足条件的substring。
因此,我们只需要控制这样一个滑动窗口并提前计算出一下每一个位置对应的下一个辅音字符出现的位置即可。
2. 代码实现
给出python代码实现如下:
python
class Solution:
def countOfSubstrings(self, word: str, k: int) -> int:
n = len(word)
next_consonants = [n for _ in range(n)]
idx = n
for i in range(n-1, -1, -1):
next_consonants[i] = idx
if word[i] not in "aeiou":
idx = i
i, j = 0, 0
cnt = defaultdict(int)
ans = 0
while j < n:
while j < n and (any(cnt[ch] <= 0 for ch in "aeiou") or cnt["c"] < k):
if word[j] in "aeiou":
cnt[word[j]] += 1
else:
cnt["c"] += 1
j += 1
while all(cnt[ch] > 0 for ch in "aeiou") and cnt["c"] >= k:
if cnt["c"] == k and all(cnt[ch] > 0 for ch in "aeiou"):
ans += (next_consonants[j-1] - (j-1))
if word[i] in "aeiou":
cnt[word[i]] -= 1
else:
cnt["c"] -= 1
i += 1
return ans
提交代码评测得到:耗时6407ms,占用内存25MB。