Leetcode 3306. Count of Substrings Containing Every Vowel and K Consonants II

  • [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。

相关推荐
YuTaoShao27 分钟前
【LeetCode 热题 100】994. 腐烂的橘子——BFS
java·linux·算法·leetcode·宽度优先
好易学·数据结构9 小时前
可视化图解算法56:岛屿数量
数据结构·算法·leetcode·力扣·回溯·牛客网
墨染点香11 小时前
LeetCode Hot100【5. 最长回文子串】
算法·leetcode·职场和发展
im_AMBER14 小时前
Leetcode 03 java
算法·leetcode·职场和发展
轮到我狗叫了14 小时前
力扣.1312让字符串成为回文串的最少插入次数力扣.105从前序和中序遍历构造二叉树牛客.拼三角力扣.57插入区间编辑
算法·leetcode·职场和发展
科大饭桶18 小时前
数据结构自学Day8: 堆的排序以及TopK问题
数据结构·c++·算法·leetcode·二叉树·c
木子.李34718 小时前
记录Leetcode中的报错问题
算法·leetcode·职场和发展
达文汐18 小时前
【中等】题解力扣22:括号生成
java·算法·leetcode·深度优先
Ylinnnnn1 天前
二分查找法
c++·学习·算法·leetcode·力扣·c·入门
达文汐1 天前
【中等】题解力扣21:合并两个有序链表
java·算法·leetcode·链表