Leetcode 每日一题:Crack The Safe

写在前面:

学期真的忙起来了,我的两个社团也在上一周终于完成了大部分招新活动。虽然后面有即将到来的期中考试和求职,但希望能有时间将帖子的频率提上去吧(真的尽量因为从做题思考到写博客讲解思路需要大量的时间,在勤工俭学打工的多方压力下尽量保证更新频率)~~

今天我带来的依旧是一个 Graph Theory 图论的问题,也是一道非常典型又不典型的类型。典型是说这道题目有一个专门的算法,De Bruijn 算法。不典型的一点是如果不知道这个算法,基本不太可能想到可以用 Graph Theory 解决,且就算用到了 graph theory,也会很难 come up 一个 solutions,就染我们一起来看看,也一起来学习一下这个这个 De Bruijn sequence 的算法吧!

题目介绍:

题目信息:

  • 题目链接:https://leetcode.com/problems/cracking-the-safe/description/
  • 题目类型:De Bruijn,Graph,DFS
  • 题目来源:Google 高频面试题
  • 题目难度:Hard

题目问题:

  • 有一个系统被一串数字组成的密码锁保护,密码长度为 n (将会被给到),密码的数大于等于0,小于 k(将会被给到)
  • 检查密码的机制是,他只会检查最后输入的 n 项,如果当前 n 项 成功 match 密码,密码锁将会被破解
  • 给定 n 和 k
  • 返回一个 最小长度的 sequence,这个sequence 将满足,在我们从左到右依次输入时,我们会在某一次输入的时候输入到正确的密码组合
  • 返回任意满足的 sequence 都可,尝试到正确密码的早晚不影响结果

题目想法:

如何将抽象问题转化为实际问题:

首先,根据这个题目的真实密码由 n 个 不大于 k 的正整数组成,再到我们需要一个 sequence,让其能保证我们能在某一次尝试中尝试到密码,所以我们的这个 sequence 应该就需要包涵所有的 n 个 不大于 k 的正整数所能组成集合。

举例:

在 n = 2,k = 2 的时候,可能的密码就是 00, 01, 10, 11,如果我们的 sequence 包含所有的可能组合,如 ‘00011011’ 那我们这个sequence就可以在某一刻尝试出真正的密码

所以,这个问题的首先关键就是,我们需要找到在给定 n,k 下所有满足条件的组合,并将他们组合成一个 sequence,这样就能保证我们一定能包含真正的密码。但是,这样并不是最短的

De Bruijn 数列:

因为题目不仅需要找出满足条件的 sequence,同时要求我们用最短的长度解决这个问题,而满足能将所有组合全部记录下来并且最短长度的数列就是 De Bruijn 数列

De Brujin 数列 (n = 2, k = 2) of ‘000111011’ is ‘00110

De Brujin 数列的形成原理就是:我们总是能够利用上一个位置的数去组合成一个新的组合,从而将所需要的长度缩减一半:

比如 “00“ 和 ”01“ 两个组合,实际上可以写成 ”001“,第二个组合的时候我们借用上一个组合的其中一个字母同样可以完成生成。因此,这道题目就转化为了,求出在 给定 n 和 k 之下的 De Bruijn 数列

如何求出 De Bruijn 结果:

我们将使用 DFS 算法求出 我们所需要的 De Bruijn 结果。具体思路是:

  • 创建一个初始位 n 的全 0 string,这个就是我们的第一个 组合,都是 0
  • 然后每次遍历到下一个数字:
    • 如果我们已经遍历了所有的可能性,意味着我们已经找到了 De Bruijn 答案,返回 true
    • 我们尝试 0 到 k 的所有组合尝试,并且从头拿掉一个数,这样能保证我们正在观察的这个substring + 新的char 是一个合理的 combination。针对每一个组合尝试:
      • 如果这个新组合还没有被遍历过,以这个组合继续遍历向下
      • 如果返回 true,则直接返回
      • 如果失败,则 move on 去下一个组合继续尝试
    • 最后返回的结果,是在遍历结束后所有成功的组合的数列,也就是我们的 De Bruijn 数列

题目代码:

class Solution {
public:
    int total;
    int n;
    int k;
    
    bool DFS(unordered_map<string, bool>& visited, string& ans){
        // if we finish traverse all nodes, return true since we find it
        if(visited.size() == total){
            return true;
        }
        
        // try each possible choice and see if it can yield a complete path
        for(int i = 0; i < k; i++){
            ans += to_string(i);
            // the cur word is a new combination that we can form, and we want to make sure its unique
            string cur = ans.substr(ans.size() - n);
            
            if(!visited.contains(cur)){
                visited[cur] = true;
                // if there is successful try, automatically refer back
                if(DFS(visited, ans)){
                    return true;
                }
                
                //backtracking and reset
                visited.erase(cur);
            }
            //backtracking, remove the char behind
            ans.pop_back();
        }
        
        // there will be no way to find it, return false
        return false;
    }
    
    string crackSafe(int n, int k) {
        //this is the total amount of choice for free choice n spot, where each spot as k choice
        total = pow(k, n);
        this->k = k;
        this->n = n;
        
        //start with the a sequence with length n and all 0, since we always has all choose 0 choice
        string ans(n, '0');
        unordered_map<string, bool> visited;
        visited[ans] = true;
        
        DFS(visited, ans);
        return ans;
    }
};

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/885860.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

当人工智能拥抱餐饮业,传统与创新的交融

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 今天我们要聊一个充满烟火气的行业&#x…

Threejs绘制圆锥体

上一章节实现了胶囊体的绘制&#xff0c;这节来绘制圆锥体&#xff0c;圆锥体就是三角形旋转获得的&#xff0c;如上文一样&#xff0c;先要创建出基础的组件&#xff0c;包括场景&#xff0c;相机&#xff0c;灯光&#xff0c;渲染器。代码如下&#xff1a; initScene() {this…

信息安全工程师(22)密码学网络安全应用

前言 密码学在网络安全中的应用极为广泛且深入&#xff0c;它通过多种技术手段确保数据的机密性、完整性和真实性。 一、数据加密 对称加密&#xff1a; 定义&#xff1a;使用相同的密钥进行加密和解密的过程。特点&#xff1a;加密和解密速度快&#xff0c;适用于大数据量的加…

网站集群批量管理-密钥认证与Ansible模块

一、集群批量管理-密钥认证 1、概述 管理更加轻松&#xff1a;两个节点,通过密钥形式进行访问,不需要输入密码,仅支持单向. 服务要求(应用场景)&#xff1a; 一些服务在使用前要求我们做秘钥认证.手动写批量管理脚本. 名字: 密钥认证,免密码登录,双机互信. 2、原理 税钥对…

websocket集群部署遇到的一些事

最近刚好有个场景&#xff0c;业务处理一份报告需要关注实时处理的进度。 本来打算使用前端轮训方式&#xff0c;但是考虑到这样效率比较低&#xff0c;也无法精确知道处理进度&#xff0c;就想到用websocket和前端实时交互&#xff0c;进度有更新就通知前端&#xff0c;避免了…

视频集成与融合项目中需要视频编码,但是分辨率不兼容怎么办?

在众多视频整合项目中&#xff0c;一个显著的趋势是融合多元化的视频资源&#xff0c;以实现统一监管与灵活调度。这一需求促使项目团队不断探索新的集成方案&#xff0c;确保不同来源的视频流能够无缝对接&#xff0c;共同服务于统一的调看与管理平台&#xff0c;进而提升整体…

MobaXterm基本使用 -- 服务器状态、批量操作、显示/切换中文字体、修复zsh按键失灵

监控服务器资源 参考网址&#xff1a;https://www.cnblogs.com/144823836yj/p/12126314.html 显示效果 MobaXterm提供有这项功能&#xff0c;在会话窗口底部&#xff0c;显示服务器资源使用情况 如内存、CPU、网速、磁盘使用等&#xff1a; &#xff08;完整窗口&#xff0…

GAMES101(17~18节,物理材质模型)

材质 BRDF 材质&#xff1a;决定了光线与物体不同的作用方式 BRDF定义了物体材质,包含漫反射和镜面部分 BSDF &#xff08;scattering散射&#xff09; BRDF&#xff08;reflect反射&#xff09; BTDF 光线打击到物体上会向四面八方散射 反射 光线打击到物体上反射出去…

MATLAB案例 | Copula的密度函数和分布函数图

本文介绍各种类型&#xff08;Gaussian、t、Gumbel、Clayton、Frank&#xff09;Copula的密度函数和分布函数图的绘制 完整代码 clc close all clear%% ********************计算Copula的密度函数和分布函数图************************ [Udata,Vdata] meshgrid(linspace(0,1…

C#自定义工具类-数组工具类

目录 数组工具类基本操作 1.排序&#xff1a;升序&#xff0c;降序 2.查找 1&#xff09;查找最值&#xff1a;最大值&#xff0c;最小值 2&#xff09;查找满足条件的单个对象 3&#xff09;查找满足条件的所有对象 4&#xff09;选取数组中所有对象的某一字段 完整代…

查缺补漏----程序查询方式和中断方式计算题

1.程序查询方式 总结下来就是&#xff1a; 必须在外设传输完端口大小的数据时访问端口&#xff0c;以防止数据未被及时读出而丢失。 占CPU总时间&#xff1a;就是某段时间内设备用了多少时钟周期/PCU有多少个时钟周期 CPU的时钟周期数&#xff1a;就看主频&#xff0c;主频表示…

大数据开发--1.1大数据概论

目录 一.大数据的概念 什么是大数据&#xff1f; 二. 大数据的特点 三. 大数据应用场景 四. 大数据分析业务步骤 大数据分析的业务流程&#xff1a; 五.大数据职业规划 职业方向 岗位技术要求 六. 大数据学习路线 一.大数据的概念 什么是大数据&#xff1f; 数据 世界…

Spring Boot技术:构建高效网上购物平台

第3章 系统分析 3.1 可行性分析 在系统开发之初要进行系统可行分析&#xff0c;这样做的目的就是使用最小成本解决最大问题&#xff0c;一旦程序开发满足用户需要&#xff0c;带来的好处也是很多的。下面我们将从技术上、操作上、经济上等方面来考虑这个系统到底值不值得开发。…

车辆重识别(注意力 U-Net:学习在哪些区域寻找胰腺)论文阅读2024/10/01

什么是注意力机制&#xff1f; 什么是加性注意力&#xff1f; 大致说一下流程&#xff1a; 对于一张特征图来说&#xff0c;对于这张图中的每一个像素向量&#xff08;例如a&#xff09;&#xff0c;计算该向量与所有像素向量的相似度&#xff0c;对这些相似度进行激活函数…

【重学 MySQL】四十五、数据库的创建、修改与删除

【重学 MySQL】四十五、数据库的创建、修改与删除 一条数据存储的过程数据输入数据验证数据处理数据存储数据持久化反馈与日志注意事项 标识符命名规则基本规则长度限制保留字与特殊字符命名建议示例 MySQL 中的数据类型创建数据库创建数据库时指定字符集和排序规则 查看数据库…

数据库重建索引的作用?

重建索引是数据库管理中的一个重要操作&#xff0c;主要用于优化数据库性能和提高查询效率。以下是重建索引的一些主要用途&#xff1a; 提高查询性能&#xff1a;随着时间的推移&#xff0c;数据的插入、更新和删除会导致索引碎片化&#xff0c;重建索引可以减少碎片&#xf…

DNS with libevent

DNS with libevent: high-level and low-level functionality libevent提供了少量用于解析DNS名字的API&#xff0c;以及用于实现简单DNS服务器的机制。 我们从用于名字查询的高层机制开始介绍&#xff0c;然后介绍底层机制和服务器机制。 Portable blocking name resolution…

15年408计算机网络

第一题&#xff1a; 解析&#xff1a; 接收方使用POP3向邮件服务器读取邮件&#xff0c;使用的TCP连接&#xff0c;TCP向上层提供的是面向连接的&#xff0c;可靠的数据传输服务。 第二题&#xff1a; 解析&#xff1a;物理层-不归零编码和曼彻斯特编码 编码1&#xff1a;电平在…

CSS中字体图标的使用

引言&#xff1a; 在网页设计当中&#xff0c;会有很多很简洁的图标&#xff0c;比如箭头&#xff0c;照相机&#xff0c;放大镜等 这些大概率都是使用字体图标来完成的&#xff0c;因为字体图标比较简洁高效&#xff0c;不会像图片一样需要向浏览器请求数据。那么字体图标该…

网络协议详解--IPv6

IPv6产生背景 &#xff08;1&#xff09;地址空间的耗尽&#xff1a;因特网呈指数级发展&#xff0c;导致IPv4地址空间几乎耗尽。虽然采用了子网划分、CIDR和NAT地址转换技术&#xff0c;但这没有从根源解决地址耗尽的问题 &#xff08;2&#xff09;IP层安全需求的增长&#x…