通过率 37% · 提交 585 · 通过 216
小慕在英语学习中遇到了一个有趣的问题。他发现英语中有一类单词叫作“”,其结构为辅音+元音(aeiou)+辅音(r除外)+e,比如bike、cake等。 现在,小慕有一个字符串,单词之间用空格分隔。他需要先对每个单词中的字母进行反转,但如果某个单词中包含数字等其他非字母字符,则不对该单词进行反转。 反转完成后,小慕想统计整个字符串中,包含相对开音节结构的(子串中字符可以重复,且子串是连续的)。
这类题属于华为 OD 机考真题方向中「100分 / 字符串」方向的高频题型,通常考察对「100分 / 字符串」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
字符串,以空格分割的多个单词,字符串长度<10000,字母只考虑小写
含有相对开音节结构的子串个数,注:个数<10000
示例 1
输入示例
ekam a ekac
输出示例
2
反转后为 make a cake 其中make、cake为相对开音节子串,返回2。
示例 2
输入示例
!ekam a ekekac
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
除了滑窗过程以外,本题还涉及到诸多字符串处理的模拟过程,难度不大但是综合性较强,也考察一些基础语法和字符串相关 API 的应用,需要仔细读题并理解题意。
对于输入的整个字符 s,我们首先按照空格进行分割为列表 lst,然后判断 lst 里的元素 lst[i]。 如果该元素仅包含字母,则进行反转,否则不进行处理。代码为
假设我们已知一个长度为 4 的字符串 word,它必须满足以下条件,才是一个相对开音节:
因此我们可以构造一个 check() 函数,来判断长度为 4 的字符串 word 是否为相对开音节。 如果是,则返回 1,表示相对开音节的总计数 +1。
特别注意:关于 word[0] 和 word[2] 的判断,除了判断 word[0] 和 word[2] 不位于 vowel 集合中,还必须判断 word[0] 和 word[2] 是一个字母。否则,形如 ca&e 或者 #ake 这样的字符串会被错判为相对开音节。
处理完 lst 中的元素之后,我们再次遍历 lst 中的每一个字符串元素 lst[i]。如果:
lst[i] 的长度小于 4,那么一定无法寻找到相对开音节,可以直接跳过lst[i] 的长度大于等于 4,则对 lst[i] 本身进行窗口长度为 4 的滑窗计算,考虑 lst[i] 的每一个长度为 4 的子字符串 word 是否为相对开音节。故整体代码如下:
复杂度分析 设 L 为输入字符串的总长度(所有单词的长度之和加上分隔空格)。
注意本题窗口长度固定为 4,所以「滑窗」实际退化成逐位枚举起点,不需要维护增量状态,这也是每个窗口能 O(1) 判断的原因。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
输出示例
2
反转后为!ekam a cakeke因!ekam含非英文字符所以未反转,其中 cake、keke为相对开音节子串,返回2。
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有