有一個須要密碼才能打開的保險箱。密碼是 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); } }