【前缀和】1456.定长子串中元音的最大数目

简介: 本篇将学习前缀和OJ题定长子串中元音的最大数目相关知识。

📍前言

本篇将学习前缀和OJ题定长子串中元音的最大数目相关知识。


🕺作者: 迷茫的启明星


学习路线

C语言从0到1

C++初阶

数据结构从0到1

😘欢迎关注:👍点赞🙌收藏✍️留言


🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要,有问题可在评论区提出,感谢阅读!!!


持续更新中~


【前缀和】1456. 定长子串中元音的最大数目

问题描述

给定一个字符串 s 和一个整数 k,要求找到 s 中包含最多元音的字符子串,并返回其长度。其中,元音字母包括 a, e, i, o, 和 u。


暴力解法

一种直观的解法是遍历所有可能的子字符串,并统计其中元音字母的数量。这种方法的时间复杂度为 O(n^2),其中 n 为字符串 s 的长度。当字符串长度较大时,这种解法会超时。


class Solution {
public:
    bool check(char x)
    {
        string es="aeiou";
        for(int i=0;i<es.size();++i)
        {
            if(es[i]==x)return true;
        }
        return false;
    }
    int maxVowels(string s, int k) {
        int flag=0;
        int maxn=0;
        for(int i=0;i<s.size()-k+1;i++)
        {
            for(int j=i;j<i+k;++j)
            {
                if(check(s[j]))flag++;
            }
            maxn=max(flag,maxn);
            flag=0;
        }
        return maxn;
    }
};

滑动窗口算法

为了降低时间复杂度,我们可以采用滑动窗口算法。滑动窗口算法通过维护一个固定大小的窗口,在字符串上滑动,从而避免了对每个子字符串的重复计算。


窗口滑动

首先,我们需要初始化一个窗口大小为 k 的滑动窗口。然后,从左到右滑动窗口,并统计窗口内元音字母的数量。在滑动过程中,我们需要更新窗口内元音字母的数量,并在找到最大元音数量时更新结果。


class Solution {
public:
    bool check(char x)
    {
        string es="aeiou";
        for(int i=0;i<es.size();++i)
        {
            if(es[i]==x)return true;
        }
        return false;
    }
    int maxVowels(string s, int k) {
        int nums[s.size()];
        nums[0] = check(s[0]) ? 1 : 0;
        int maxn = nums[k - 1];
        for(int j = k; j < s.size(); ++j) {
            maxn = max(maxn, nums[j] - nums[j - k]);
        }
        return maxn;
    }
};

优化

在这个解法中,我们仍然需要遍历整个字符串。为了进一步提高效率,我们可以在初始化滑动窗口时,直接计算前 k 个字符的元音数量,从而避免在滑动过程中重复计算。

class Solution {
public:
    bool check(char x)
    {
        string es="aeiou";
        for(int i=0;i<es.size();++i)
        {
            if(es[i]==x)return true;
        }
        return false;
    }
    int maxVowels(string s, int k) {
        int nums[s.size()];
        nums[0] = check(s[0]) ? 1 : 0;
        for(int i = 1; i < s.size(); ++i) {
            nums[i] = nums[i - 1] + (check(s[i]) ? 1 : 0);
        }
        int maxn = nums[k - 1];
        for(int j = k; j < s.size(); ++j) {
            maxn = max(maxn, nums[j] - nums[j - k]);
        }
        return maxn;
    }
};

官方题解:

解题思路:


我们可以使用滑动窗口的方法来解决这个问题。首先,定义一个isVowel函数用于判断字符是否为元音。然后,初始化两个指针left和right,分别表示窗口的左右边界。初始时,left指针指向字符串s的第一个字符,right指针指向left指针的下一个字符。


1.初始化一个变量vowel_count用于记录当前窗口内的元音字符个数。


2.在每次循环中,先更新vowel_count,然后将当前vowel_count与ans进行比较,取最大值。


3.如果right指针没有越界,则将right指针向右移动一个位置,同时更新窗口内的元音字符个数。


4.如果right指针已经越界,则将left指针向右移动一个位置,同时更新窗口内的元音字符个数。


5.重复步骤2-4,直到right指针到达字符串s的末尾。


代码实现:


class Solution {
public:
    bool isVowel(char ch) {
        return ch == 'a' || ch == 'e' || ch == 'i' || ch == 'o' || ch == 'u'; 
    }
    int maxVowels(string s, int k) {
        int n = s.size();
        int vowel_count = 0;
        int left = 0, right = 0;
        int ans = 0;
        while (right < n) {
            vowel_count += isVowel(s[right]);
            ++right;
            if (right - left == k) {
                ans = max(ans, vowel_count);
                vowel_count -= isVowel(s[left]);
                ++left;
            }
        }
        return ans;
    }
};



总结:

这个官方题解采用了滑动窗口的方法来解决问题。通过维护一个固定大小的窗口,我们可以在O(n)的时间复杂度内找到最长连续元音字符的子串。在实际编程中,可以根据具体需求对这个解法进行优化,例如在字符串中只包含元音字符的情况下,可以进一步优化时间复杂度。


相关文章
|
并行计算 算法 计算机视觉
【MATLAB 】 CEEMDAN 信号分解+模糊熵(近似熵)算法
【MATLAB 】 CEEMDAN 信号分解+模糊熵(近似熵)算法
732 0
|
人工智能 机器人 UED
AIGC革新,将文字或者LOGO融入AI视频基于PIKA-labs(Python3.10)
很多平台都会禁止用户使用带有网址或者二维码的头像以及文章配图,这样可以有效的防止用户的一些“导流”行为。当然,头像、文章或者视频现在都是AI来审,毕竟现在人工的成本实在太高,但是如果我们把文字元素直接融入图像或者视频之中,如此一来,AI也会很难识别出一些“导流”的元素。 本次我们依靠PIKA-labs平台,无需本地环境,直接简单粗暴输出带有文字元素的光影视频效果,基于Python3.10。
AIGC革新,将文字或者LOGO融入AI视频基于PIKA-labs(Python3.10)
|
XML 数据格式
解决Unsatisfied dependency expressed through field ‘jdbcTemplate‘;问题~
解决Unsatisfied dependency expressed through field ‘jdbcTemplate‘;问题~
843 0
|
人工智能 架构师 NoSQL
24岁程序媛,二战考研失利、三无人员 ==> 最佳新人、优秀个人,讲讲我的技术成长之路
能力、格局、谋略、远见、耐心。灵魂的欲望是命运的先知,希望永远自信、洒脱、松弛、明媚、张扬;追随自己的内心、以喜欢的方式、往正确的方向前行,永远在路上,我甘之如饴! 持续精进Java领域相关技术,包括微服务、高并发、高可用、分布式、集群等等;希望能接触到更多更大的优质项目,逐渐成长为一名具备全栈思维的架构师,既能深入理解底层技术,又能把控全局架构;抽时间了解学习Go语言、人工智能、大模型等领域。 在探索中明晰后续的发展方向,形成自己的一套体系,成为主管、管理层乃至更高,不希望自己的上限只是程序员。
|
数据采集 存储 XML
Python实现网络爬虫自动化:从基础到实践
本文将介绍如何使用Python编写网络爬虫,从最基础的请求与解析,到自动化爬取并处理复杂数据。我们将通过实例展示如何抓取网页内容、解析数据、处理图片文件等常用爬虫任务。
1858 1
|
容器
Flutter下拉刷新上拉加载的简单实现方式一
Flutter下拉刷新上拉加载的简单实现方式一
405 2
|
JSON API 数据格式
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
Python| 如何使用 DALL·E 和 OpenAI API 生成图像(2)
|
文件存储
Unicode标准与其他编码规则
Unicode标准与其他编码规则
253 6
|
网络协议 JavaScript 测试技术
网络安全-好用的模糊测试器汇总与思考
网络安全-好用的模糊测试器汇总与思考
649 0
|
JSON 缓存 物联网
推荐一款go语言的开源物联网框架-opengw
推荐一款go语言的开源物联网框架-opengw
594 4