通过率 36% · 提交 1,729 · 通过 626
小慕正在处理一批字符串数据,他定义了一个规则:如果一个字符串的开头和结尾都是元音字母(aeiouAEIOU),就称它为“”。其中,出现在字符串中间的非元音字母个数,就是它的“”。例如: - "a" 和 "aa" 都是元音字符串,瑕疵度为 0 - "aiur" 不是元音字符串(结尾不是元音字母) - "abira" 是元音字符串,瑕疵度为 2 现在,小慕拿到了一个字符串,他想知道:在给定一个目标瑕疵度的情况下,最长的符合条件的元音有多长。如果不存在这样的子串,则输出 0。 子串定义:字符串中任意连续字符组成的序列。
这类题属于华为 OD 机考真题方向中「100分 / 2024E」方向的高频题型,通常考察对「100分 / 2024E」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
首行输入是一个整数,表示预期的瑕疵度flaw,取值范围[0, 65535]。
接下来一行是一个仅由字符a-z和A-Z组成的字符串,字符串长度(0, 65535]。
输出为一个整数,代表满足条件的元音字符子串的长度。
示例 1
输入示例
2 aeueo
输出示例
0
没有满足条件的元音字符子串,输出 0
示例 2
输入示例
0 asdbuiodevauufgh
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
本题很显然是要找到一个最长的滑动窗口,窗口需要满足以下两个条件:
k 个(即瑕疵度)窗口的辅音个数,可以用一个变量 win_consonant_num 来维护即可。要特别注意一点,因为元音子串要求子串首尾的字符都是元音,我们必须固定 left 的位置始终指向一个元音,这使得 left 右移的条件会和常规的滑窗问题略有不同。
在开始滑窗时,必须先找到最左边的第一个元音作为 left 的起始位置以及滑窗的开始位置。
Q1:对于每一个右指针 right 所指的元素 ch,做什么操作?
Q2:什么时候要令左指针 left 右移?left 对应的元素做什么操作?while 中的循环不变量是什么?
Q3:什么时候进行 ans 的更新?
A1:如果 ch 是一个辅音,则窗口中辅音个数 win_consonant_num += 1
A2:win_consonant_num > k,即滑窗子串所对应的瑕疵度超过了瑕疵度阈值 k,left 右移,直到窗口的瑕疵度 win_consonant_num <= k,且 left 指向一个元音(因为要求元音子串开头是元音)。
A3:如果 ch 是一个元音(因为要求元音子串末尾是元音),且此时瑕疵度恰好为 k,那么可以更新答案。
复杂度分析 设字符串长度为 n。第一段循环从左到右找第一个元音作为滑窗起点,最坏 O(n)。滑窗阶段 right 从起点走到串尾,left 只会单调右移,每个字符至多进窗一次、出窗一次;判断是否元音用预先构建的元音集合 vowel_set,是 O(1) 查询。因此总时间复杂度为 O(n)。空间上只有固定 10 个字符的元音集合和 left、right、win_consonant_num、ans 几个变量,额外空间复杂度 O(1)。
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
输出示例
3
满足条件的最长元音字符子串有两个,分别为uio和auu,长度为 3。
示例 3
输入示例
1 aabeebuu
输出示例
5
满足条件的最长元音字符子串有两个,分别为aabee和eebuu,长度为 5
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有