考古学家 - 华为OD统一考试(D卷)
OD统一考试(D卷)
分值: 200分
题解: Java / Python / C++
题目描述
有一个考古学家发现一个石碑,但是很可惜发现时其已经断成多段。
原地发现N
个断口整齐的石碑碎片,为了破解石碑内容,考古学家希望有程序能帮忙计算复原后的石碑文字组合数,你能帮忙吗?
备注: 如果存在石碑碎片内容完全相同,则由于碎片间的顺序不影响复原后的碑文内容,仅相同碎片间的位置变化不影响组合
输入描述
第一行输入N
,N
表示石碑碎片的个数
第二行依次输入石碑碎片上的文字内容S
共有N
组
输出描述
输出石碑文字的组合(按照升序排列),行尾无多余空格
示例1
输入:
3
a b c
输出:
abc
acb
bac
bca
cab
cba
示例2
输入:
3
a b a
输出:
aab
aba
baa
示例3
输入:
3
a b ab
输出:
aabb
abab
abba
baab
baba
题解
这是一个典型的排列组合问题,可以使用回溯算法来生成所有可能的组合。
代码大致描述:
- 主函数
main
中,读取石碑碎片的个数N和每个碎片的文字内容S,并进行排序,以便后续生成有序的排列组合。。- 创建一个用于标记是否使用过的数组
used
和一个用于存储当前组合的容器collect
,以及rs
存储结果的字符串。- 调用
solve
函数进行回溯,生成所有可能的排列组合。- 在
solve
函数中,检查当前组合的长度是否等于石碑碎片的个数N,如果是则拼接成字符串并输出(避免重复输出相同的排列组合)。- 递归调用
solve
函数,尝试不同的组合。- 在每次递归调用前,标记当前石碑碎片为已使用,以防止重复使用。
- 递归调用后,将标记恢复,进行下一轮尝试。
这样,通过回溯算法,可以遍历所有可能的排列组合,最终输出升序排列的石碑文字组合。
Java
import java.util.*;
/**
* @author code5bug
*/
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = in.nextInt();
String[] cs = new String[n];
for (int i = 0; i < n; i++) cs[i] = in.next();
Arrays.sort(cs);
Solution solution = new Solution(cs, n);
solution.solve(new ArrayList<>());
for (String result : solution.rs) {
System.out.println(result);
}
}
}
class Solution {
private final String[] cs;
private final int n;
private boolean[] used;
public Set<String> rs;
public Solution(String[] cs, int n) {
this.cs = cs;
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
华为OD机试题库题解2024 文章被收录于专栏
华为OD机考(CDE卷)题库(绝对都是原题),帮助你上岸华为(已经不少小伙伴成功上岸)。提供Java、Python、C++ 三种语言的解法。每篇文章都有详细的解题步骤、代码注释详细及相关知识点的练习题。有问题,随时解答。