MarcusV(南墙大佬的搬运工)

南墙大佬的CSDN博客地址

导航

Java实现 LeetCode 753 破解保险箱(递归)

753. 破解保险箱

有一个需要密码才能打开的保险箱。密码是 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);
    }
 
}

posted on 2020-04-15 21:20  MarcusV  阅读(115)  评论(0编辑  收藏  举报