通过率 54% · 提交 985 · 通过 527
小慕在开发一个文本处理工具时遇到了一个需求:需要删除字符串`s`中,如果有多个字符的出现次数相同且都是最少,则将这些字符全部删除。
这类题属于华为 OD 机考真题方向中「100分 / 哈希表」方向的高频题型,通常考察对「100分 / 哈希表」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
输入只包含小写字母
输出删除后剩余的字符串;若删除后字符串长度为0,则输出字符串"empty"
示例 1
输入示例
abcdd
输出示例
dd
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
为了删除掉字符串 s 中出现次数最少的字符,我们必须先统计 s 中的所有字母的出现个数,很容易想到使用哈希表的 `Counter()` 来完成这个功能。
然后我们再统计哪些字母出现的次数为 最小出现次数,用一个哈希集合记录这些需要删除的字母,再使用字符串的 `replace()` 方法或者 `join()` 方法即可完成删除。
本题显然也是 哈希表 在统计元素频率类型的题目中的典型应用。
思路展开
参考代码分三步完成删除。第一步统计频率:遍历字符串 s 的每个字符,用哈希表 cnt 记录每种字符的出现次数,键是字符、值是次数。第二步确定要删谁:先在 cnt 的所有值里取最小值 minCnt,再把出现次数恰好等于 minCnt 的字符全部收进哈希集合 minCntSet。这里用集合而不是单个变量,正是为了落实题面“多个字符出现次数相同且都是最少,则全部删除”的规则。第三步重建字符串:按原顺序再遍历 s 一遍,凡是不在 minCntSet 里的字符依次追加到 StringBuilder 中,这样保留下来的字符相对顺序不变,等价于把待删字符从原串中抠掉。之所以第三步要靠哈希集合,是因为每个字符都要问一次“我该不该被删”,集合的平均 O(1) 查询让这一步保持线性。最后还有一个输出分支:如果删完后结果为空(例如所有字符出现次数都相同,全部被判定为最少而删光),参考代码按约定输出 empty。
复杂度分析
设字符串长度为 n,出现过的不同字符种数为 k(若只含小写字母则 k 不超过 26)。统计频率遍历一次 s,O(n);求最小值和构建 minCntSet 各遍历一次 cnt,O(k);重建字符串再遍历一次 s,每个字符做一次 O(1) 的集合查询,O(n)。总时间 O(n + k),与字符串长度成正比。空间上 cnt 与 minCntSet 占 O(k),结果串最长 O(n)。
登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有