leetcode-753: 破解保险箱

简介: leetcode-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" 也能打开保险箱。

解题

方法一:Hierholzer 算法

参考链接

节点上存放n-1位数,路径上1位,然后可以变成n位tmp=currNode*k+j,到另一个节点后,再转化为后n-1位

int currNode=i%node;

0~k-1就是到该节点后,可以选择的路径,通过side数组来记录删除的边。

由于记录路径,而不是节点,因此要在循环内, res+=j+'0'; 将路径加入到结果中去

class Solution {
public:
    int node;
    string res;
    void dfs(vector<int>& side,int n,int k,int i){
        int currNode=i%node;//节点的值(n-1位)
        for(int j=0;j<k;j++){
            int tmp=currNode*k+j; //节点+边(1位) (共n位)
            if(!side[tmp]++){ /* 仅遍历没有走过的边 */
                dfs(side,n,k,tmp);
                res+=j+'0';//j+'0'代表一个字符('0'~'9')
            }
        }
    }
    string crackSafe(int n, int k) {
        node=pow(k,n-1);/* 节点个数 */
        vector<int> side(node*k,0);/* 边数标志,用来指示每条边是否遍历过 */
        dfs(side,n,k,0);/* 从 n -1 个 0 的节点开始寻找 */
        res.append(n-1,'0');/* 补充起始节点字符串 */
        return res;/* 无需 reverse,翻转前后均为正确答案 */
    }
};


相关文章
|
2月前
acwing 5408 保险箱
acwing 5408 保险箱
30 1
|
7月前
|
数据处理
如何破解一道力扣做一宿的窘境
如何破解一道力扣做一宿的窘境
48 0
|
存储 安全 数据库
你的密码安全吗?这三种破解方法让你大开眼界!
密码破解,是黑客们最喜欢的玩具之一。当你用“123456”这类简单密码来保护你的账户时,就像裸奔一样,等待着黑客的攻击。所以,今天我们就来聊聊密码破解知识,看看那些常见的密码破解方法,以及如何防范它们。
956 0
你的密码安全吗?这三种破解方法让你大开眼界!
|
数据安全/隐私保护
AcWing 767. 信息加密
AcWing 767. 信息加密
77 0
AcWing 767. 信息加密
|
算法 数据安全/隐私保护
【密码学】一文读懂凯撒密码
之前介绍了很多现代密码学相关的知识,俗话说得好,要站在巨人的肩膀上, 因此呢,接下来聊一聊古典密码的有关知识(才不是因为我现在没素材了, 手动狗头),古典密码相比于现代密码而言,更多的是一些trick或者说文字游戏,不过其中所蕴含的思想在现代密码当中也广泛出现,本文主要给大家介绍一下凯撒密码,这个古老但是又被众人都知晓的一个古典密码。
1461 0
【密码学】一文读懂凯撒密码
|
算法 前端开发 程序员
「LeetCode」383-赎金信⚡️
「LeetCode」383-赎金信⚡️
138 0
「LeetCode」383-赎金信⚡️
|
程序员 Go 数据安全/隐私保护
早恋与加密第一回: 古典加密
早恋与加密第一回: 古典加密
|
存储 算法 安全
程序员如何用Python编程暴力算法破解凯撒密码
  破解凯撒密码可以用到一项密码分析技术,叫作暴力算法(brute-force),它的攻击是通过尝试每一种可能解密密文的密钥实现的。没有什么能够阻挡密码分析人员猜测密钥、用密钥解密密文、观察输出,并在没能破解出密文的情况下寻找下一把密钥。正因为这样的暴力算法对凯撒密码来说过于有效,所以在实际应用中根本不应该使用凯撒密码去加密一段秘密信息。   在理想的情况下,一段密文不会落入任何人的手中,然而Kerckhoffs原则(以19世纪密码学家Auguste Kerckhoffs命名)表明,一段密文即使在所有人都知道来源且某些人可能得到的情况下,也应该保持其安全性。20世纪时,数学家Claude S
458 0
|
存储 算法 Java
【算法千题案例】每日LeetCode打卡——69.赎金信
📢前言 🌲原题样例:赎金信 🌻C#方法:数组存储 🌻Java 方法:数组存储 💬总结
|
人工智能 算法 数据安全/隐私保护
算法笔试模拟题精解之“破译密码”
可以使用尺取法来解题;设当前区间为[L, R]。初始L = R = 0;使用尺取法需要判断什么时候调整L和R。
算法笔试模拟题精解之“破译密码”