通过率 50% · 提交 986 · 通过 492
小慕正在开发一个文本摘要工具,需要实现一个字符串摘要算法,请你帮他计算给定字符串的。 1、去除字符串中所有非字母的符号 2、对于去除非字母符号后的字符串:如果出现(不区分大小写),则输出:该字符(小写)+ 连续出现的次数 3、对于去除非字母符号后的字符串:如果是(不区分大小写),则输出:该字符(小写)+ 该字母之后字符串中出现的该字符的次数 4、对按照以上方式表示后的字符串进行排序:字母和紧随的数字作为一组进行排序,数字大的在前,数字相同的则按字母进行排序,字母小的在前。
这类题属于华为 OD 机考真题方向中「100分 / 滑动窗口」方向的高频题型,通常考察对「100分 / 滑动窗口」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
一行字符串,长度为[1,200]
转换后的摘要字符串
示例 1
输入示例
bAaAcBb
输出示例
a3b2b2c0
第一个b非连续字母,该字母之后字符串中还出现了2次 (最后的两个Bb) ,所以输出b2; a连续出现3次,输出a3; c非连续,该字母之后字符串再没有出现过c,输出c0; Bb连续2次,输出b2。 对b2a3c0b2进行排序,最终输出a3b2b2c0。
示例 2
输入示例
aabbcc
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
相关图解步骤
先看指定步骤补关键知识点,再回到本题完成标准输入输出。
去除非字母字符的操作非常简单,使用以下代码即可完成:
每一个字符都会被摘要为 字母 + 数字 的形式。对于每一个字符 ch,分为两种情况:
ch 属于 连续字母,那么后面的数字应该是本段连续字母的个数ch 属于 非连续字母,那么后面的数字应该是该 ch 右边的相同字母的个数对于第一点,统计某一段连续字母的个数,可以用 滑动窗口 来解决这个问题。
对于第二点,储存每一个字符 ch 右边的相同字母的个数,很容想到用 哈希表 来储存元素个数,但需要 从右往左 遍历字符串 s。
正因为上述问题的存在,所以滑动窗口的过程不再是常规的 right 右移再动 left 右移,而是先令 left 左移再令 right 左移,即构建一个 从右往左 进行的滑动窗口。
left 所指的元素 ch,做什么操作?right 移动到什么位置?right 所指的元素 s[right] 进行比较right 移动到当前左指针 left 的位置,用于后续的继续判断right 所指字母和左指针 left 所指字母不相同时,更新答案复杂度分析 设原字符串长度为 n。第一步过滤非字母字符(C++ 版同时转小写)遍历一次,O(n)。第二步从右往左的滑窗只扫描一遍字符串:left 从 n-1 走到 0,right 只在字符段切换时跳到 left 的位置,每个字符恰好被比较一次,更新哈希表 dic 是均摊常数操作,这一步 O(n)。第三步对摘要结果 ans 排序,ans 里每个元素对应一段连续字符,段数最多为 n,排序最坏 O(n log n)。所以总时间复杂度 O(n log n),瓶颈在最后的排序;空间上,过滤后的字符串、哈希表与结果列表合计 O(n)。
边界与注意事项
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
输出示例
a2b2c2
时间限制 1000 ms · 内存限制 128 MB
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有