当前位置: 首页 > article >正文

【Leetcode刷题记录】1456. 定长子串中元音的最大数目---定长滑动窗口即解题思路总结

1456. 定长子串中元音的最大数目

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

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

这道题的暴力求解的思路是通过遍历字符串 s 的每一个长度为 k 的子串,逐个计算每个子串中元音字母的数量,并记录过程中遇到的最大元音数量。暴力求解法要用到双重循环,时间复杂度是 O ( k ∗ n ) O(k*n) O(kn)

bool isVowel(char c) {
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}

int maxVowels(string s, int k) {
    int max_vowels = 0;
    // 遍历字符串s的每一个长度为k的子串
    for (size_t i = 0; i <= s.length() - k; ++i) {
        int count = 0;
        // 计算当前子串中的元音字母数量
        for (size_t j = i; j < i + k; ++j) {
            if (isVowel(s[j])) {
                ++count;
            }
        }
        // 更新最大元音字母数
        max_vowels = max(max_vowels, count);
    }
    return max_vowels;
}

对于字符串s中的任意一个长度为k的子串substr,假设结束位置是f,用 v s ( f ) v_s(f) vs(f)表示这个子串所包含的元音字母的个数,那么下一个长度相同子串所包含的元音字母个数 v s ( f + 1 ) = v s ( f ) + ( s [ f + 1 ] 是元音字母 ) − ( s [ f − k + 1 ] 是元音字母 ) v_s(f+1)=v_s(f)+(s[f+1]是元音字母)-(s[f-k+1]是元音字母) vs(f+1)=vs(f)+(s[f+1]是元音字母)(s[fk+1]是元音字母),这个求解过程就相当于维护了一个长度为k的窗口,从数组的开始部分一直移动到数组的结束部分,这个过程如图所示:

在这里插入图片描述

bool isVowel(char c) {
    return c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u';
}

int maxVowels(string s, int k) {
    int max_vowels = 0, current_vowels = 0;
    // 初始化窗口,计算第一个窗口内的元音数量
    for (int i = 0; i < k; ++i) {
        if (isVowel(s[i])) {
            ++current_vowels;
        }
    }
    max_vowels = current_vowels;
    // 开始滑动窗口
    for (size_t i = k; i < s.length(); ++i) {
        // 如果离开窗口的字符是元音,则减少计数
        if (isVowel(s[i - k])) {
            --current_vowels;
        }
        // 如果进入窗口的字符是元音,则增加计数
        if (isVowel(s[i])) {
            ++current_vowels;
        }
        // 更新最大元音数
        max_vowels = max(max_vowels, current_vowels);
    }

    return max_vowels;
}

定长滑动窗口解题思路总结

  1. 初始化窗口
    • 确定窗口的大小k,即子数组或子串的长度。
    • 计算第一个窗口(从索引0开始到索引k-1)的目标值(例如,在这个问题中是计算元音的数量)。这一步为后续的窗口移动提供了一个初始状态。
  2. 设定初始状态
    • 根据第一步的结果更新最优解的状态变量(如最大值、最小值等)。在这个例子中,就是记录下当前遇到的最大元音数量。
  3. 滑动窗口
    • 从数组或字符串的第k个元素开始,依次向右移动窗口。每次移动时,执行以下操作:
      • 移出元素:检查即将离开窗口左侧的元素是否满足特定条件(在这个问题中,判断它是否为元音),并相应地调整当前窗口内的计数器。
      • 加入元素:检查新进入窗口右侧的元素是否满足特定条件,并相应地调整当前窗口内的计数器。
      • 更新解:根据当前窗口内的目标值(如元音数量),决定是否更新最优解。
  4. 返回结果
    • 当遍历完整个数组或字符串后,返回记录下来的最优解作为最终结果。

http://www.kler.cn/a/532259.html

相关文章:

  • 手写MVVM框架-实现简单的数据代理
  • 简单理解精确率(Precision)和召回率(Recall)
  • 记忆化搜索和动态规划 --最长回文子串为例
  • sysbench压力测试工具mysql以及postgresql
  • FBX SDK的使用:基础知识
  • Linux安装zookeeper
  • 代码随想录八股训练营学习总结
  • 哈希(Hashing)在 C++ STL 中的应用
  • 虚幻基础17:动画蓝图
  • 网站快速收录:如何优化网站长尾关键词布局?
  • BUU14 [极客大挑战 2019]PHP1
  • 基于Springboot框架的学术期刊遴选服务-项目演示
  • proxmox创建虚拟机
  • Vue安装相关依赖冲突问题
  • 中缀表达式 C++ 蓝桥杯 栈
  • 方法一:将私钥存入环境变量,环境变量指什么//spring中,rsa私钥应该怎么处置
  • CSS基本语法
  • Redis 持久化原理分析和使用建议
  • 在LINUX上安装英伟达CUDA Toolkit
  • 数据结构---前缀和
  • 2025年2月4日(i2c和spi树莓派oled sdd1306)
  • 艾瑞泽8车机安装软件
  • Linux基本指令2
  • wx050基于django+vue+uniapp的傣族节日及民间故事推广小程序
  • JUC 三大辅助类: CountDownLatch CyclicBarrier Semaphore
  • Chromium132 编译指南 - Android 篇(七):安装其他构建依赖项