Leetcode 每日一题:Crack The Safe

news2024/10/1 13:35:10

写在前面:

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

今天我带来的依旧是一个 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;
    }
};

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

矩阵系统源码搭建的具体步骤,支持oem,源码搭建

一、前期准备 明确需求 确定矩阵系统的具体用途&#xff0c;例如是用于社交媒体管理、电商营销还是其他领域。梳理所需的功能模块&#xff0c;如多账号管理、内容发布、数据分析等。 技术选型 选择适合的编程语言&#xff0c;如 Python、Java、Node.js 等。确定数据库类型&…

盘点2024年远程控制黑科技,4款好用到飞起,你get了吗?

随着数字化的浪潮&#xff0c;远程办公变得越来越流行。虽然有些人担心不在办公室工作&#xff0c;效率会降低&#xff0c;但实际上并不是这样。技术一直在进步&#xff0c;现在有很多好用的远程控制软件&#xff0c;它们不仅打破了地点的限制&#xff0c;还让在家工作也能井井…

Spring Boot实现足球青训俱乐部管理自动化

4 系统设计 4.1 系统架构设计 B/S系统架构是本系统开发采用的结构模式&#xff0c;使用B/S模式开发程序以及程序后期维护层面需要的经济成本是很低的&#xff0c;用户能够承担得起。使用这样的模式开发&#xff0c;用户使用起来舒心愉悦&#xff0c;不会觉得别扭&#xff0c;操…

Spring Boot技术在足球青训管理中的创新应用

3 系统分析 3.1 可行性分析 可行性分析是该平台系统进行投入开发的基础第一步&#xff0c;必须对其进行可行性分析才能够降低不必要的需要从而使资源合理利用&#xff0c;更具有性价比和降低成本&#xff0c;同时也是系统平台的成功的未雨绸缪的一步。 3.1.1 技术可行性 技术可…

Redis篇(缓存机制 - 多级缓存)(持续更新迭代)

目录 一、传统缓存的问题 二、JVM进程缓存 1. 导入案例 2. 初识Caffeine 3. 实现JVM进程缓存 3.1. 需求 3.2. 实现 三、Lua语法入门 1. 初识Lua 2. HelloWorld 3. 变量和循环 3.1. Lua的数据类型 3.2. 声明变量 3.3. 循环 4. 条件控制、函数 4.1. 函数 4.2. 条…

足球青训后台管理系统:Spring Boot实现指南

2 相关技术简介 2.1 Java技术 Java是一门伟大的纯面向对象的编程语言和编程语言。同时&#xff0c;它还是Java语言从嵌入式开发到企业级开发的平台。Java凭借其一次编译&#xff0c;任何地方执行的优点&#xff0c;使得盛行的web应用程序有大量的Java编译&#xff0c;很好地支…

生信初学者教程(十九):免疫浸润细胞

文章目录 介绍加载R包导入数据所需函数运行ImmuCellAI其他免疫浸润方法输出结果总结介绍 免疫浸润分析在癌症研究中扮演着至关重要的角色,它有助于理解癌症微环境中免疫细胞的组成及其作用。bulk转录组基因表达数据的反卷积技术,如CIBERSORT算法,是实现这一分析的重要工具。…

云原生数据库 PolarDB

简介&#xff1a;云原生数据库 PolarDB 是阿里云自研产品&#xff0c;在存储计算分离架构下&#xff0c;利用了软硬件结合的优势&#xff0c;为用户提供秒级弹性、高性能、海量存储、安全可靠的数据库服务。100%兼容MySQL和PostgreSQL生态&#xff0c;支持分布式扩展&#xff0…

Spring整合Mybatis Plus

Mybatis Plus是原始Mybatis的增强&#xff0c;框架内部自动实现了Mapper的CRUD操作&#xff0c;极大的提高了编程效率。对单表操作基本无需编写Mapper.xml文件内容&#xff0c;对复杂的多表关联查询时&#xff0c;需要额外在Mapper.xml编写对应的sql语句。 Spring整合Mybatis P…

《如何高效学习》

有道云笔记 第一部分 整体性学习策略 结构 结构就像思想中的一座城市&#xff0c;有很多建筑物&#xff0c;建筑物之间有道路相连&#xff0c;有高大而重要的与其他建筑有上百条路相连&#xff0c;无关紧要的建筑只有少数泥泞的小道与外界相通。 建立良好的知识结构就是绘制…

仿真设计|基于51单片机的土壤温湿度监测及自动浇花系统仿真

目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现&#xff08;protues8.7&#xff09; 程序&#xff08;Keil5&#xff09; 全部内容 资料获取 具体实现功能 &#xff08;1&#xff09;DS18B20实时检测环境温度&#xff0c;LCD1602实时显示土壤温湿度&…

【C++】vector详解:接口使用、迭代器、内存理解、与模拟实现

文章目录 1. 前言2. 内存角度 理解3. vector的使用定义 | 构造函数vector iteratorvector 空间增长问题vector 增删查改vector 迭代器失效避免迭代器失效的建议 4. 如何理解 二维动态vector5. 模拟实现 vector6. 相关文档 1. 前言 vector 是 C 标准模板库&#xff08;STL&…

实例说明机器学习框架

机器学习框架是用于构建和训练机器学习模型的工具集合&#xff0c;它们提供了丰富的功能和库&#xff0c;帮助开发者简化模型开发流程。以下是几个流行的机器学习框架及其应用实例&#xff1a; 1. TensorFlow TensorFlow 是由 Google 开发的开源机器学习框架&#xff0c;广泛…

记一次使用python编写exp

使用的漏洞是企望制造ERP系统 RCE漏洞 POC POST /mainFunctions/comboxstore.action HTTP/1.1 Host: Cache-Control: max-age0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/129.0.…

影刀RPA实战:Excel拆分与合并工作表

1.影刀操作excel的优势 Excel&#xff0c;大家都不陌生&#xff0c;它是微软公司推出的一款电子表格软件&#xff0c;它是 Microsoft Office 套件的一部分。Excel 以其强大的数据处理、分析和可视化功能而闻名&#xff0c;广泛应用于商业、教育、科研等领域。可以说&#xff0…

生信初学者教程(二十):免疫浸润分析

文章目录 介绍加载R包导入数据所需函数堆积图箱线图热图相关性矩阵图输出结果总结介绍 在本章节中,将详细探讨免疫细胞的组成结构、其在不同个体和分组之间的相对丰度差异,并通过热图等可视化手段,对这些差异进行直观而深入的解析。这些分析将有助于科研人员更好地理解免疫细…

828华为云征文|华为云 Flexus X 实例之家庭娱乐中心搭建

话接上文《828华为云征文&#xff5c;华为云Flexus X实例初体验》&#xff0c;这次我们利用手头的 Flexus X 实例来搭建家庭影音中心和密码管理环境。 前置环境 为了方便小白用户甚至运维人员&#xff0c;我觉得现阶段的宝塔面板 和 1Panel 都是不错的选择。我这里以宝塔为例…

动态规划最低票价

前言&#xff1a;之前看到过这个题目归结到动态规划&#xff0c;当初还没什么思路&#xff0c;其实就是定义好dp [ i ] 为到第 i 个的最小费用就行&#xff0c;我们可以用upper_bound来优化我们的查找下标 题目地址 class Solution { public:int mincostTickets(vector<int&…

应对集运仓库丢件问题:集运系统的视频监控验货功能

在集运行业中&#xff0c;包裹丢件问题一直是令企业头疼的问题之一。客户投诉、纠纷处理不仅消耗了大量的人力物力&#xff0c;还可能影响企业的信誉和客户满意度。集运系统提供的视频验货服务&#xff0c;为解决这一难题提供了有效的解决方案。 一、集运仓库丢件问题的现状 集…

人口普查管理系统基于VUE+SpringBoot+Spring+SpringMVC+MyBatis开发设计与实现

目录 1. 系统概述 2. 系统架构设计 3. 技术实现细节 3.1 前端实现 3.2 后端实现 3.3 数据库设计 4. 安全性设计 5. 效果展示 ​编辑​编辑 6. 测试与部署 7. 示例代码 8. 结论与展望 一个基于 Vue Spring Boot Spring Spring MVC MyBatis 的人口普查管理…