力扣刷题日记-753-破解保险箱

242 阅读1分钟
  • 有一个需要密码才能打开的保险箱。密码是 n 位数, 密码的每一位是 k 位序列 0, 1, ..., k-1 中的一个 。

你可以随意输入密码,保险箱会自动记住最后 n 位输入,如果匹配,则能够打开保险箱。

举个例子,假设密码是 "345",你可以输入 "012345" 来打开它,只是你输入了 6 个字符.

请返回一个能打开保险箱的最短字符串。

来源:力扣(LeetCode) 链接:leetcode.cn/problems/cr… 著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

思路 起始 (n - 1) 个00 最后走回原点,形成一个环,


/**
 * @param {number} n
 * @param {number} k
 * @return {string}
 */
var crackSafe = function(n, k) {
    let highest = Math.pow(10, n - 1)
    let ans = ''
    const seen = new Set()
    const dfs = (node) => {
        for(let i = 0; i < k; i++) {
            let nei = node * 10 + i 
            if(!seen.has(nei)) {
                seen.add(nei)
                dfs(nei % highest)
                ans += i
            }
        }
    }
    dfs(0)
    for(let i = 1; i < n; i++) [
        ans += '0'
    ]
    return ans
};