原题🔗:力扣
这道题的思路有两个主要要点。
第一个是构造一个节点数为k^(n-1)、出度和入度均为k的图。
第二个是从这张图中找到一个欧拉回路。
针对第一点:图的构造,按照题意,实际上👇的蓝色框(n位数)就是要cover所有可能的n位数密码组合,所以我们要从图中 获得k^n个可能的n位数,而此时已经存在k^(n-1)个节点,所以我们只需要将所有节点的k个(出)路径全部经过即可。
针对第二点,欧拉回路的算法👇
为什么需要将从v开始的所有回路镶嵌到原来(以u为起点)的回路中?是为了保证生成的n位数是连贯的。(这里我也不确定,是猜想的)
class Solution {
StringBuilder sb = new StringBuilder();
int n, k, mod;
Set<Integer> vis = new HashSet<>(); //判断每条边是否访问过
public String crackSafe(int N, int K) {
n = N; k = K; mod = (int)Math.pow(10, n - 1);
dfs(0); //从0点出发
sb.append("0".repeat(n - 1));
return sb.toString();
}
void dfs(int u) {
for (int i = 0; i < k; i++) { //对于每个点循环k条边即可
int v = u * 10 + i; //即边的编号
if (vis.contains(v)) continue;
vis.add(v); //标记该边已经访问
dfs(v % mod); //去掉第一位为结点编号
sb.append(i); //添加最后一个数字
}
}
}
作者:Tizzi
链接:https://leetcode.cn/problems/cracking-the-safe/solutions/2054157/javac-ou-la-hui-lu-by-tizzi-rzsy/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。