- 题目
华为OD机试真题-考古学家-2023年OD统一考试(C卷) - 解题思路
看到全排列,直接回溯法,不过这里的注意,碎片值有可能完全相同,此时需要用一个visited数组来记录走过的结点。
3.JAVA代码
public class Test23 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
List<String> list = new ArrayList<>();
for (int i = 0; i < n; i++) {
list.add(sc.next());
}
List<String> ret = cal(list);
for (String s : ret) {
System.out.println(s);
}
}
public static List<String> cal(List<String> list){
Set<String> ret = new HashSet<>();
int[] visited = new int[list.size()];
for (int i = 0; i < list.size(); i++) {
dfs(list, ret, "", 0, visited);
}
return new ArrayList<>(ret);
}
public static void dfs(List<String> list, Set<String> ret, String str, int level, int[] visited){
if(level == list.size()){
ret.add(str);
return;
}
for (int i = 0; i < list.size(); i++) {
if(visited[i] == 0){
String s = list.get(i);
str += s;
visited[i] = 1;
dfs(list, ret, str, level + 1, visited);
visited[i] = 0;
str = str.substring(0, str.length() - s.length());
}
}
}
}