有一个须要密码才能打开的保险箱。密码是 n 位数, 密码的每一位是 k 位序列 0, 1, …, k-1 中的一个 。java
你能够随意输入密码,保险箱会自动记住最后 n 位输入,若是匹配,则可以打开保险箱。app
举个例子,假设密码是 “345”,你能够输入 “012345” 来打开它,只是你输入了 6 个字符.ide
请返回一个能打开保险箱的最短字符串。ui
示例1:spa
输入: n = 1, k = 2
输出: “01”
说明: "10"也能够打开保险箱。翻译
示例2:code
输入: n = 2, k = 2
输出: “00110”
说明: “01100”, “10011”, “11001” 也能打开保险箱。字符串
提示:get
n 的范围是 [1, 4]。
k 的范围是 [1, 10]。
k^n 最大可能为 4096。it
PS:
该说不说,百度翻译都比这个强
class Solution { public static final int[] MASK = {0, 1, 10, 100, 1000}; public String crackSafe(int n, int k) { M = MASK[n]; StringBuilder sb = new StringBuilder(); Hierholzer(0, k, new BitSet(), sb); for (int i = 0; i < n - 1; i++) sb.append(0); return sb.toString(); } public int M; public void Hierholzer(int n, int k, BitSet bs, StringBuilder sb) { bs.set(n); int tail = n % 10; n = (n % M) * 10; for (int i = 0; i < k; i++, n++) { if (!bs.get(n)) Hierholzer(n, k, bs, sb); } sb.append(tail); } }
有一个须要密码才能打开的保险箱。密码是 n 位数, 密码的每一位是 k 位序列 0, 1, …, k-1 中的一个 。
你能够随意输入密码,保险箱会自动记住最后 n 位输入,若是匹配,则可以打开保险箱。
举个例子,假设密码是 “345”,你能够输入 “012345” 来打开它,只是你输入了 6 个字符.
请返回一个能打开保险箱的最短字符串。
示例1:
输入: n = 1, k = 2
输出: “01”
说明: "10"也能够打开保险箱。
示例2:
输入: n = 2, k = 2
输出: “00110”
说明: “01100”, “10011”, “11001” 也能打开保险箱。
提示:
n 的范围是 [1, 4]。
k 的范围是 [1, 10]。
k^n 最大可能为 4096。
PS:
该说不说,百度翻译都比这个强
class Solution { public static final int[] MASK = {0, 1, 10, 100, 1000}; public String crackSafe(int n, int k) { M = MASK[n]; StringBuilder sb = new StringBuilder(); Hierholzer(0, k, new BitSet(), sb); for (int i = 0; i < n - 1; i++) sb.append(0); return sb.toString(); } public int M; public void Hierholzer(int n, int k, BitSet bs, StringBuilder sb) { bs.set(n); int tail = n % 10; n = (n % M) * 10; for (int i = 0; i < k; i++, n++) { if (!bs.get(n)) Hierholzer(n, k, bs, sb); } sb.append(tail); } }