LeetCode算法题(Go语言实现)_15

题目

给你字符串 s 和整数 k 。

请返回字符串 s 中长度为 k 的单个子字符串中可能包含的最大元音字母数。

英文中的 元音字母 为(a, e, i, o, u)。

一、代码实现

go 复制代码
func maxVowels(s string, k int) int {
    vowels := map[byte]bool{'a':true, 'e':true, 'i':true, 'o':true, 'u':true}
    maxCount, current := 0, 0
    
    // 初始化窗口
    for i := 0; i < k; i++ {
        if vowels[s[i]] {
            current++
        }
    }
    maxCount = current
    
    // 滑动窗口
    for i := k; i < len(s); i++ {
        // 移除左边字符
        if vowels[s[i-k]] {
            current--
        }
        // 添加右边字符
        if vowels[s[i]] {
            current++
        }
        // 更新最大值
        if current > maxCount {
            maxCount = current
        }
    }
    return maxCount
}

二、算法分析

1. 核心思路
  • 滑动窗口策略:通过固定长度的窗口在字符串上滑动,每次仅需计算窗口两端字符对元音数量的影响,避免重复遍历
  • 元音快速判断:使用哈希表存储元音字母,实现O(1)时间复杂度的查询操作
2. 关键步骤
  1. 初始化窗口:计算前k个字符中的元音数量
  2. 窗口滑动
    • 左边界字符退出时减少计数(若为元音)
    • 右边界字符进入时增加计数(若为元音)
  3. 极值更新:实时记录窗口移动过程中的最大元音数
3. 复杂度分析
指标 说明
时间复杂度 O(n) 只需单次遍历字符串
空间复杂度 O(1) 仅需存储元音表和几个变量

三、图解示例

四、边界条件与扩展

1. 特殊场景处理
  • k=0:直接返回0(无有效窗口)
  • k > len(s):返回整个字符串的元音数
  • 全元音字符串:如"aeiou",k=2时返回2
2. 多语言实现对比
语言 实现要点 性能优化技巧
Python 使用collections.deque实现滑动窗口 生成器表达式减少内存占用
Java 预处理元音索引数组new boolean[256] 位运算优化元音判断
C++ std::unordered_set存储元音,std::max实时比较 循环展开优化窗口滑动操作
3. 算法对比
方法 优点 缺点
滑动窗口法 时间复杂度O(n),空间最优 需处理边界条件
前缀和法 支持随机区间查询 空间复杂度O(n)
暴力枚举 实现简单 时间复杂度O(nk)

五、总结与拓展

1. 核心创新点
  • 增量计算:通过窗口两端操作将时间复杂度从O(nk)优化到O(n)
  • 位运算优化 :将元音判断转换为位掩码操作(如mask = 0b100000100000100010001
2. 数学证明

设字符串长度为n,滑动窗口移动(n-k)次,完整覆盖所有可能子串。通过归纳法可证:

  • 初始窗口计算正确性:k次遍历得到准确元音数
  • 转移方程有效性:count_new = count_old - left + right保持正确性
3. 应用场景扩展
  • 实时流处理:动态维护窗口统计量
  • DNA序列分析:统计特定碱基组合的出现频率
  • 日志监控系统:检测异常时间段内的特定字符出现频率
相关推荐
何其有幸.几秒前
实验6-3 使用函数求特殊a串数列和(PTA|C语言)
c语言·数据结构·算法
不会计算机的捞地5 分钟前
【数据结构入门训练DAY-24】美国大选
数据结构·算法
明月看潮生25 分钟前
青少年编程与数学 02-018 C++数据结构与算法 11课题、分治
c++·算法·青少年编程·编程与数学
Echo``1 小时前
2:QT联合HALCON编程—图像显示放大缩小
开发语言·c++·图像处理·qt·算法
.似水1 小时前
2025.4.22_C_可变参数列表
java·c语言·算法
Felven1 小时前
A. Ideal Generator
java·数据结构·算法
MoonBit月兔2 小时前
双周报Vol.70: 运算符重载语义变化、String API 改动、IDE Markdown 格式支持优化...多项更新升级!
ide·算法·哈希算法
How_doyou_do2 小时前
树状数组底层逻辑探讨 / 模版代码-P3374-P3368
数据结构·算法·树状数组
小鹿鹿啊2 小时前
C语言编程--14.电话号码的字母组合
c语言·开发语言·算法
小O的算法实验室3 小时前
2024年ESWA SCI1区TOP:量子计算蜣螂算法QHDBO,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进