3305. 元音辅音字符串计数

问:某班有 10 个人至少 20 岁,3 个人至少 21 岁,那么恰好 20 岁的人有多少个?

答:「至少 20 岁」可以分成「恰好 20 岁」和「至少 21 岁」,所以「至少 20 岁」的人数减去「至少 21 岁」的人数,就是「恰好 20 岁」的人数,即 10−3=7。

根据这个思路(容斥原理),本题等价于如下两个问题:

处理一个恰好的问题,可以转化为两个至少的问题

每个元音字母至少出现一次,并且至少包含k个辅音字母的子串个数。记作f(k)

每个元音字母至少出现一次,并且至少包含k+1个辅音字母的子串个数。记作f(k+1)

2者相减,所表达的含义就是恰好包含k个辅音字母了,所以答案为f(k+1)-f(k)

本题中,子串越长,包含的元音越多

代码如何构思:

首先关于至少的问题,在滑动窗口的过程中,枚举子串的右端点,把右端点的字母放到窗口里面,为了判断出两个至少的条件(元音字母至少出现一次,至少包含k个辅音字母),得用两个东西来维护。

对于元音来说,每个元音的出现次数是不一样的,所以得用一个哈希表或者数组来维护每个元音的出现次数,辅音只要求总数是>=k,所以只需要一个变量来维护

当右端点进入窗口之后,根据右端点是元音还是辅音,来增加cnt1或者cnt2的值,当窗口的子串满足要求的时候。也就是当右端点固定,右端点满足要求的时候,要求出的是有多少个子串的左端点是满足要求的

怎么操作?当满足条件的时候,收缩左端点,左端点向右移动(左端点更新过程中,cnt1和cnt2的更新与上文相同)

当收缩结束时,left是什么?循环结束的时候从left到right是满足条件还是不满足条件?是不满足条件,才退出循环。但是退出循环的前一刻left-1是满足要求的,同理,前面的更长的子串是满足要求的

python 复制代码
class Solution:
    def f(self,word: str, k: int) -> int:
        cnt1 = defaultdict(int)
        cnt2 = 0
        ans = left = 0
        for i in word:
            if i in 'aeiou':
                cnt1[i] += 1
            else:
                cnt2 += 1
            while len(cnt1) == 5 and cnt2 >= k:
                cur = word[left]
                if cur in 'aeiou':
                    cnt1[cur] -= 1
                    if cnt1[cur] == 0:
                        del cnt1[cur]
                else:
                    cnt2 -= 1
                left += 1
            ans += left 
        return ans
    def countOfSubstrings(self, word: str, k: int) -> int:
        return self.f(word,k) - self.f(word,k+1)
        
相关推荐
火车叼位8 分钟前
也许你不需要创建.venv, 此规范使python脚本自备依赖
python
火车叼位15 分钟前
脚本伪装:让 Python 与 Node.js 像原生 Shell 命令一样运行
运维·javascript·python
孤狼warrior25 分钟前
YOLO目标检测 一千字解析yolo最初的摸样 模型下载,数据集构建及模型训练代码
人工智能·python·深度学习·算法·yolo·目标检测·目标跟踪
Katecat9966335 分钟前
YOLO11分割算法实现甲状腺超声病灶自动检测与定位_DWR方法应用
python
玩大数据的龙威1 小时前
农经权二轮延包—各种地块示意图
python·arcgis
ZH15455891311 小时前
Flutter for OpenHarmony Python学习助手实战:数据库操作与管理的实现
python·学习·flutter
belldeep1 小时前
python:用 Flask 3 , mistune 2 和 mermaid.min.js 10.9 来实现 Markdown 中 mermaid 图表的渲染
javascript·python·flask
喵手1 小时前
Python爬虫实战:电商价格监控系统 - 从定时任务到历史趋势分析的完整实战(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·电商价格监控系统·从定时任务到历史趋势分析·采集结果sqlite存储
喵手1 小时前
Python爬虫实战:京东/淘宝搜索多页爬虫实战 - 从反爬对抗到数据入库的完整工程化方案(附CSV导出 + SQLite持久化存储)!
爬虫·python·爬虫实战·零基础python爬虫教学·京东淘宝页面数据采集·反爬对抗到数据入库·采集结果csv导出
B站_计算机毕业设计之家2 小时前
猫眼电影数据可视化与智能分析平台 | Python Flask框架 Echarts 推荐算法 爬虫 大数据 毕业设计源码
python·机器学习·信息可视化·flask·毕业设计·echarts·推荐算法