题
思
此题超出能力范围,不是我能做出来的。
官方题解很妙。
翻译一下题目的意思:找出一个最短字符串,使得这个字符串包含了[0,1,……k-1]的长度为n所有排列。
对于每一种排列,题解中使用前n-1个字符作为节点,每个节点有k条边,这样,由于入度等于出度,到最后就必然只剩下初始节点未被访问。
因此此图必有欧拉回路。
题解中使用Hierholzer算法找出欧拉回路,具体做法就是深搜,若提前回到原点,则换一个点再来(代码中使用深搜中循环遍历[0……k-1]的方式解决)。
以下代码为官方题解。
代码
class Solution {
private int k;
private int max;
private Set<Integer> set = new HashSet<Integer>();
private StringBuilder sb = new StringBuilder();
public String crackSafe(int n, int k) {
max = (int) Math.pow(10, n - 1);
this.k = k;
dfs(0);
for (int i = 0; i < n - 1; i++) {
sb.append(0);
}
return sb.toString();
}
private void dfs(int node) {
for (int i = 0; i < k; i++) {
int idx = node * 10 + i;
if (!set.contains(idx)) {
set.add(idx);
dfs(idx % max);
sb.append(i);
}
}
}
}