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

提示:

  1. n 的范围是 [1, 4]
  2. k 的范围是 [1, 10]
  3. k^n 最大可能为 4096

思路,1. 数据量比较少,容易处理。

有点像小m序列一样,构造转移。

class Solution {
public:string d[4096];bool vist[4096];int N;int cnt=0;int a[4];string crackSafe(int n, int k) {N=n;if(n==0) return "";if(n==1) {string tt="",t="A";for(int i=0;i<k;i++){ t[0]='0'+i;tt+=t;}return tt;}dfs(0,k,a);memset(vist,0,sizeof(vist)); int sum=pow(k,n);string res=d[0],scur=res; vist[0]=true;for(int i=1;i<sum;i++){string ts=scur.substr(1,n-1); for(int i=sum-1;i>-1;i--){if(!vist[i]&&d[i].substr(0,n-1)==ts){vist[i]=true;scur=d[i];res+=scur.substr(n-1,1);    break;  }   }}return res;}//得到全部排列void dfs(int n,int k,int a[]){if(n==N){string t="A",tt="";    for(int i=0;i<N;i++){ t[0]='0'+a[i];tt+=t;}d[cnt++]=tt;  }elsefor(int i=0;i<k;i++){a[n]=i;dfs(n+1,k,a);}}
};

高效方法

public: string crackSafe(int n, int k)
{ string res = string(n, '0'); unordered_set<string> s; s.insert(res); for (int i = 0; i < pow(k, n); i++) { string tmp = res.substr(res.length() - n + 1, n - 1); for (int j = k -1;j >= 0; j--) { string key = tmp + to_string(j); if (s.find(key) == s.end()) { res += to_string(j); s.insert(key); break; } } } return res;
}

LeetCode 破解保险箱 全排列【1】相关推荐

  1. LeetCode 破解保险箱(全排列)

    描述: 有一个需要密码才能打开的保险箱.密码是 n 位数, 密码的每一位是 k 位序列 0, 1, -, k-1 中的一个 . 你可以随意输入密码,保险箱会自动记住最后 n 位输入,如果匹配,则能够打 ...

  2. Leetcode 753. 破解保险箱 C++

    Leetcode 753. 破解保险箱 题目 有一个需要密码才能打开的保险箱.密码是 n 位数, 密码的每一位是 k 位序列 0, 1, -, k-1 中的一个 . 你可以随意输入密码,保险箱会自动记 ...

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

    753. 破解保险箱 有一个需要密码才能打开的保险箱.密码是 n 位数, 密码的每一位是 k 位序列 0, 1, -, k-1 中的一个 . 你可以随意输入密码,保险箱会自动记住最后 n 位输入,如果 ...

  4. leetcode-753: 破解保险箱

    leetcode-753: 破解保险箱 题目 解题 方法一:Hierholzer 算法 题目 题目链接 有一个需要密码才能打开的保险箱.密码是 n 位数, 密码的每一位是 k 位序列 0, 1, -, ...

  5. 自制机器人15分钟破解保险箱密码

    去年圣诞节,内森·赛德的妻子给了他一个从Graigslist上淘来的二手保险箱.乍一看,好像是个奇怪的礼物.这对夫妻已经有了同型号的SentrySafe防火保险箱,从家得宝花120美元买的.但这个,有 ...

  6. LeetCode-753. 破解保险箱

    题目链接:753. 破解保险箱 很日常,没看题解之前依然没有发现这是道图论的题目(每日一题从官方题解开始=.=).第一次在OJ练习上做到图论的题,之前做图论的题都是辛辛苦苦写了好多结构体然后按点按边做 ...

  7. 我是如何使用自制机器人在15分钟内破解保险箱密码的?

    本文讲的是 我是如何使用自制机器人在15分钟内破解保险箱密码的?, 亮相Def Con大会 热辣的7月,安全圈有两场最为火爆的顶级信息会议在美国拉斯维加斯拉开帷幕,它们分别是美国黑帽大会BlackHa ...

  8. leetcode题:全排列-数组

    leetcode题:全排列 给定一个 没有重复 数字的序列,返回其所有可能的全排列. 示例: 输入: [1,2,3] 输出: [[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1 ...

  9. JAVA程序设计:破解保险箱(LeetCode:753)

    有一个需要密码才能打开的保险箱.密码是 n 位数, 密码的每一位是 k 位序列 0, 1, ..., k-1 中的一个 . 你可以随意输入密码,保险箱会自动记住最后 n 位输入,如果匹配,则能够打开保 ...

最新文章

  1. LeetCode Populating Next Right Pointers in Each Node II(dfs)
  2. python中的帮助_在Python中使用help帮助
  3. 深度学习核心技术精讲100篇(七十九)-深度学习应用实战案例:携程金融自动化迭代反欺诈模型体系
  4. 转:传入的表格格式数据流(TDS)远程过程调用(RPC)协议流不正确 .
  5. Spark入门:也可以用Java创建轻量级的RESTful应用程序
  6. 使用JS禁用浏览器后退按钮
  7. 2015.4.7-C#入门基础(一)
  8. 图的深度优先遍历方式 Python
  9. 霍华德大学计算机科学,霍华德大学有哪些专业
  10. HinM_COMPILER_cale计划和实现
  11. D3D9 3D渲染图像变模糊
  12. 如何写一个C语言头文件,C语言头文件如何写?.doc
  13. 浅谈产品经理入门和学习路径
  14. MySQL--学习笔记
  15. 人工智能NLTK性别发现器
  16. 换发型软件有哪些?试试这些软件吧
  17. VCIP2021:基于神经网络的双向预测blending过程
  18. 404问题之文件未找到
  19. 商家如何更改拼多多上货助手价格?上货助手修改价格详细步骤
  20. 2017百度之星作死记

热门文章

  1. Uboot27之start.S的MMU操作
  2. 前端开发学习--登录和注册页面设计(html和css,可完成两个页面点击切换)
  3. [Intensive Reading]从AlexNet理解卷积神经网络的一般结构
  4. mt管理器破解QQ语音口令红包
  5. oracle CPU 最佳型号推荐,外媒评选2020年12款最佳笔记本 CPU选择亮了
  6. 隐藏应用,在应用列表里不显示
  7. uni-app中swiper组件加入视频后无法全屏显示方案解决
  8. keepalived 检测服务状态、keepalived 检测脚本
  9. python项目实战:selenium控制浏览器自动登录扣扣_zone
  10. 动态图片怎么裁剪?教你在线裁剪gif图片