社区常称:考古学家
通过率 56% · 提交 324 · 通过 180
小慕在整理项目资料时,发现一份重要文档已经被撕成了多段碎片。原地找到了 N 个断口整齐的纸片,为了还原文档的完整内容, 小慕希望有程序能帮忙计算拼接后的文档文字,你能帮忙吗? 备注 如果存在纸片内容完全相同,则由于碎片间的顺序不影响拼接后的文档内容。。
这类题属于华为 OD 机考真题方向中「200分 / DFS」方向的高频题型,通常考察对「200分 / DFS」的建模能力与边界条件处理。掌握本题的解题思路后,可举一反三应对同类真题方向,稳步提升机考通过率。
提示:带虚线的词点一下有通俗解释。
第一行输入 N,N 表示石碑碎片的个数
第二行依次输入石碑碎片上的文字内容 S 共有 N 组
输出石碑文字的组合(按照升序排列),行尾无多余空格
示例 1
输入示例
3 a b ab
输出示例
aabb abab abba baab baba
时间限制 1000 ms · 内存限制 128 MB
本平台为独立第三方培训机构,与华为技术有限公司无任何关联;课程的服务内容与权益以购买协议为准,学习效果因个人情况而异。「华为 OD」「华为可信」等仅为对岗位与考试方向的客观描述,相关商标归各自权利人所有。
本题属于排列回溯问题的板子题,和 经典题型. 全排列 II 几乎完全一致。
唯一需要注意的是去重。参考代码用了两层保险:
1. 排序 + 同层跳过:先把 n 个纸片字符串排序,让内容相同的纸片相邻;回溯每层枚举时,若 words[i] == words[i-1] 且 used[i-1] 为假(表示同一层里前一个相同纸片刚被撤销选择),直接跳过——再选当前这个只会产生完全相同的排列。这正是题目备注「仅相同碎片间的位置变化不影响组合」在代码里的落点。 2. `ans_set` 哈希表兜底:拼出完整文档字符串后再经 ans_set 判重,确认没出现过才收入答案列表。
(另一种常见的同层去重写法是每层维护一个局部 set 记录本层已尝试过的元素,效果等价;参考代码采用的是上面「排序 + 相邻跳过」的写法。)
回溯函数用 used 数组标记每个纸片是否已进入当前路径,path 保存当前已选的纸片序列;每层横向遍历所有纸片,跳过已用过的与同层重复的。当 path 长度等于 n 时,把纸片按路径顺序拼成完整文档字符串,经 ans_set 判重后收入答案列表,与同层去重构成双保险。最后对答案列表整体排序后逐行输出。
used、path 为 O(n);ans 与 ans_set 存放所有不同结果,占 O(结果总数 × L)。words 排序,否则「跳过相邻相同元素」的同层去重不成立。登录后可查看你在本题的历史提交,以及每次的各用例通过情况。
© 2026 广州慕课网络科技有限公司 · 吴师兄学算法官网 版权所有