【优选算法】(第四十二篇)

目录

最⼩基因变化(medium)

题目解析

讲解算法原理

编写代码

单词接⻰(hard)

题目解析

讲解算法原理

编写代码


最⼩基因变化(medium)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

基因序列可以表⽰为⼀条由8个字符组成的字符串,其中每个字符都是 'A' 、 'C' 、 'G' 和
'T' 之⼀。
假设我们需要调查从基因序列 start 变为 end 所发⽣的基因变化。⼀次基因变化就意味着这个基因序列中的⼀个字符发⽣了变化。
• 例如, "AACCGGTT" --> "AACCGGTA" 就是⼀次基因变化。
另有⼀个基因库 bank 记录了所有有效的基因变化,只有基因库中的基因才是有效的基因序列。(变化后的基因必须位于基因库 bank 中)
给你两个基因序列 start 和 end ,以及⼀个基因库 bank ,请你找出并返回能够使 start 变化为 end 所需的最少变化次数。如果⽆法完成此基因变化,返回 -1 。
注意:起始基因序列 start 默认是有效的,但是它并不⼀定会出现在基因库中。

⽰例1:
输⼊:start="AACCGGTT",end="AACCGGTA",bank=["AACCGGTA"]
输出:1
⽰例2:
输⼊:start="AACCGGTT",end="AAACGGTA",bank=
["AACCGGTA","AACCGCTA","AAACGGTA"]
输出:2
⽰例3:
输⼊:start="AAAAACCC",end="AACCCCCC",bank=
["AAAACCCC","AAACCCCC","AACCCCCC"]
输出:3

提⽰:
◦ start.length == 8
◦ end.length == 8
◦ 0 <= bank.length <= 10
◦ bank[i].length == 8
◦ start 、 end 和 bank[i] 仅由字符 ['A', 'C', 'G', 'T'] 组成

讲解算法原理

解法:
算法思路:

如果将「每次字符串的变换」抽象成图中的「两个顶点和⼀条边」的话,问题就变成了「边权为1的最短路问题」。
因此,从起始的字符串开始,来⼀次 bfs 即可。

编写代码

c++算法代码:

class Solution
{
public:int minMutation(string startGene, string endGene, vector<string>& bank) {unordered_set<string> vis; // ⽤来标记已经搜索过的状态unordered_set<string> hash(bank.begin(), bank.end()); // 存储基因库⾥⾯的字符串string change = "ACGT";if(startGene == endGene) return 0;if(!hash.count(endGene)) return -1;queue<string> q;q.push(startGene);vis.insert(startGene);int ret = 0;while(q.size()){ret++;int sz = q.size();while(sz--){string t = q.front();q.pop();for(int i = 0; i < 8; i++){string tmp = t; // 细节问题for(int j = 0; j < 4; j++){tmp[i] = change[j];if(hash.count(tmp) && !vis.count(tmp)){if(tmp == endGene) return ret;q.push(tmp);vis.insert(tmp);}}}}}return -1;}
};

java算法代码:

class Solution
{public int minMutation(String startGene, String endGene, String[] bank) {Set<String> vis = new HashSet<>(); // ⽤来标记已经搜索过的状态Set<String> hash = new HashSet<>(); // ⽤来统计基因库⾥⾯的字符串for(String s : bank) hash.add(s);char[] change = {'A', 'C', 'G', 'T'};if(startGene.equals(endGene)) return 0;if(!hash.contains(endGene)) return -1;Queue<String> q = new LinkedList<>();q.add(startGene);vis.add(startGene);int step = 0;while(!q.isEmpty()){step++;int sz = q.size();while(sz-- != 0){String t = q.poll();for(int i = 0; i < 8; i++){char[] tmp = t.toCharArray();for(int j = 0; j < 4; j++){tmp[i] = change[j];String next = new String(tmp);if(hash.contains(next) && !vis.contains(next)){if(next.equals(endGene)) return step;q.add(next);vis.add(next);}}}}}return -1;}
}

单词接⻰(hard)

题目解析

1.题目链接:. - 力扣(LeetCode)

2.题目描述

字典 wordList 中从单词 beginWord 和 endWord 的转换序列是⼀个按下述规格形成的序列 beginWord -> s(1) -> s(2) -> ... -> s(k) :
• 每⼀对相邻的单词只差⼀个字⺟。
• 对于 1 <= i <= k 时,每个 s(i) 都在 wordList 中。注意, beginWord 不需要
在 wordList 中。
• s(k) == endWord
给你两个单词 beginWord 和 endWord 和⼀个字典 wordList ,返回从 beginWord 到endWord 的最短转换序列中的单词数⽬。如果不存在这样的转换序列,返回 0 。

⽰例1:
输⼊:beginWord="hit",endWord="cog",wordList=["hot","dot","dog","lot","log","cog"]输出:5
解释:⼀个最短转换序列是"hit"->"hot"->"dot"->"dog"->"cog",返回它的⻓度5。⽰例2:
输⼊:beginWord="hit",endWord="cog",wordList=["hot","dot","dog","lot","log"]输出:0
解释:endWord"cog"不在字典中,所以⽆法进⾏转换。

提⽰:
◦ 1 <= beginWord.length <= 10
◦ endWord.length == beginWord.length
◦ 1 <= wordList.length <= 5000
◦ wordList[i].length == beginWord.length
◦ beginWord 、 endWord 和 wordList[i] 由⼩写英⽂字⺟组成
◦ beginWord != endWord
◦ wordList 中的所有字符串互不相同

讲解算法原理

解法:
算法思路:

跟上题⼀样~

编写代码

c++算法代码:

class Solution
{
public:int ladderLength(string beginWord, string endWord, vector<string>& 
wordList) {unordered_set<string> hash(wordList.begin(), wordList.end());unordered_set<string> vis; // 标记已经搜索过的单词if(!hash.count(endWord)) return 0;queue<string> q;q.push(beginWord);vis.insert(beginWord);int ret = 1;while(q.size()){ret++;int sz = q.size();while(sz--){string t = q.front();q.pop();for(int i = 0; i < t.size(); i++){string tmp = t;for(char ch = 'a'; ch <= 'z'; ch++){tmp[i] = ch;if( hash.count(tmp) && !vis.count(tmp)){if(tmp == endWord) return ret;q.push(tmp);vis.insert(tmp);}}}}}return 0;}
};

java算法代码:

class Solution
{public int ladderLength(String beginWord, String endWord, List<String> 
wordList) {Set<String> hash = new HashSet<>();for(String s : wordList) hash.add(s);Set<String> vis = new HashSet<>(); // 标记已经搜索过的单词if(!hash.contains(endWord)) return 0;Queue<String> q = new LinkedList<>();q.add(beginWord);vis.add(beginWord);int ret = 1;while(!q.isEmpty()){ret++;int sz = q.size();while(sz-- != 0){String t = q.poll();for(int i = 0; i < t.length(); i++){char[] tmp = t.toCharArray();for(char ch = 'a'; ch <= 'z'; ch++){tmp[i] = ch;String next = new String(tmp);if(hash.contains(next) && !vis.contains(next)){if(next.equals(endWord)) return ret;q.add(next);vis.add(next);}}}}}return 0;}
}

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

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

相关文章

【代码随想录Day43】动态规划Part11

1143.最长公共子序列 题目链接/文章讲解&#xff1a;代码随想录 视频讲解&#xff1a;动态规划子序列问题经典题目 | LeetCode&#xff1a;1143.最长公共子序列_哔哩哔哩_bilibili class Solution {public int longestCommonSubsequence(String text1, String text2) {// 将输…

wireshark抓包

网络抓包工具Wireshark下载安装&使用详细教程-CSDN博客 下载地址&#xff1a;Wireshark Downloadhttps://www.wireshark.org/download.html modbus tcp 关于wireshark无法分析出modbusTCP报文的事情_wireshark 协议一列怎么没有modbus tcp-CSDN博客 使用Wireshark过滤…

4、Spring Boot 3.x集成MQTT(EMQX)主题动态订阅

一、前言 本篇主要是围绕着MQTT这个点&#xff0c;在生产环境中可能存储某些主题随时订阅和取消的逻辑&#xff0c;因为自己本身项目的需要所以顺便把这部分补充一下二、调整MQTT配置 1、调整 MqttConfig.java 在 MqttConfig.java 中新增两个方法/*** 添加订阅主题的方法** …

【动手学深度学习】6.2 图像卷积(个人向笔记)

1. 互相关运算 严格来说&#xff0c;卷积层是一个错误的叫法&#xff0c;因为它本质上是互相关运算而不是卷积运算。我们暂时忽略通道看看二维图像数据和隐藏表示。那么输出大小可以表示为 我们自己实现一个二维互相关运算 2. 卷积层 卷积层中有两个参数&#xff1a;卷积核权…

鸿蒙OS投票机制

(基于openharmony5.0) 投票机制 param get | grep ohos.boot.time 图 投票机制参数图 只有当所有的投票完成&#xff0c;开机动画才会退出&#xff0c;整理需要投票的系统应用&#xff08;三方应用不参与投票&#xff09;如下图所示&#xff1a; 以进程foundation为例&…

PRT一键转STL/OBJ,在线预览更直观

随着3D打印技术的普及和设计软件的多样化&#xff0c;不同3D模型格式之间的转换需求也日益增长。PRT作为一种常见的三维设计文件格式&#xff0c;在工程设计领域应用广泛。然而&#xff0c;PRT格式并不被所有3D软件和3D打印机所支持。 为什么选择我们的PRT转换器&#xff1f; …

快速理解http的get和post

在网络通信中&#xff0c;HTTP 协议扮演着非常重要的角色&#xff0c;而不同的 HTTP 方法决定了客户端与服务器之间的交互方式。 这里讲一下最常用的两种方法——GET 和 POST。 一、GET 方法 GET 方法用于从服务器获取资源。 这就像去图书馆借书——你向图书馆请求一本特定的…

光路科技TSN交换机和电力专用交换机即将亮相第31届中国国际电力设备及技术展览会

在全球能源领域正经历深刻转型之际&#xff0c;可再生能源技术的飞跃进步正为电力行业的未来开辟新径。太阳能、风能等绿色能源&#xff0c;凭借其无可比拟的优势&#xff0c;正稳步取代化石燃料&#xff0c;成为电力行业的主流趋势。多国政府积极响应&#xff0c;出台多项政策…

Vue3获取ref元素的几种方式

静态绑定 获取单个 dom 元素 v-for 中使用 需要注意的是&#xff0c;访问的时候&#xff0c;要确保 ref 引用值已经成功绑定上元素&#xff0c;我们可以使用以下几种方式确保获取

倒计时 2 天,GOSIM CHINA 2024 全日程重磅发布(附参会指南)!

伴随着全球开源技术的快速发展&#xff0c;开源已成为驱动技术创新与协作的重要力量。作为开源领域的年度盛会&#xff0c;GOSIM 大会承载这一背景下的使命&#xff0c;已连续两年聚焦全球前沿技术的突破与应用&#xff0c;推动开源技术在更多场景中的创新实践——今年&#xf…

3D数学在unity中的使用(工作小结)

前言&#xff1a; 公司的游戏&#xff0c;想实现一个类似于元气骑士前传的技能面板&#xff0c;这里的技能可以实现旋转替换。 记录一下我遇到的问题及解决办法。 如何生成这些图标 1&#xff1a;手动摆放。 优点&#xff1a;实现起来简单&#xff0c;代码量少。 缺点&…

关于onMounted和onUpdated的触发

一、在项目中&#xff0c;使用父组件页面子组件&#xff08;el-Dialog&#xff09;弹窗的结构 如果在子组件dialog中使用onMounted&#xff0c;那么这个onMounted在父组件加载的时候就会触发&#xff08;尽管这个时候弹窗没打开&#xff09; 解决方法&#xff1a;对子组件使用…

Docker 搭建mysql 连接超时问题,xxl-job启动mysql连接报错

1.本地连接Navicat报错信息&#xff0c;猜测是navicat默认连接超时导致的&#xff0c;后面换成idea一个插件虽然慢但连接上了 2013 - Lost connection to MySQL server at reading initial communication packet 2.启动xxl-job会报错&#xff0c;网上有人mysql驱动与数据库不匹…

Docker 命令替代(ctr和 crictl)

1. ctr ctr 是 containerd 的一个客户端工具。 $ ctr -v ctr containerd.io 1.6.16从输出看到,这是一个 containerd 管理工具,一般是安装完 containerd.io 之后就有的命令。 现在 Containerd 也有 namespaces 的概念,所以很多操作需要加上 -n。默认情况下运行在 default …

python 桌面程序开发

作为python新手,通过编写代码,与java、nodejs相比较,差别还有的。 环境配置: IDE:Visual Studio Code PyInstaller: 5.13.2 Python: 3.7.0 Platform: Windows-10-10.0.22621-SP0 功能描述:编写带UI界面的桌面程序,读取终端设备历史轨迹数据,采用多线程高并发,模拟终…

每日学学Java开发规范,集合处理(附阿里巴巴Java开发手册(终极版))

前言 每次去不同的公司&#xff0c;码不同的代码&#xff0c;适应不同的规范&#xff0c;经常被老大教育规范问题&#xff0c;我都有点走火入魔的感觉&#xff0c;还是要去看看阿里巴巴Java开发规范&#xff0c;从中熟悉一下&#xff0c;纠正自己&#xff0c;码出高效&#xf…

arthas常用命令(五)--heapdump 、jvm

heapdump heapdump , 类似 jmap 命令的 heap dump 功能。 dump 到指定文件。 arthas-output 是arthas 生成到项目中的文件。 dump.hprof 是自定义的 dump 文件名称。 [arthas26028]$ heapdump arthas-output/dump.hprof Dumping heap to arthas-output/dump.hprof ... Heap…

redis在项目中运用(基础)

mysql学完命令之后&#xff0c;学过jdbc。 redis也要使用Java连接redis数据库 1.Jedis 2.RedisTemplate[重点] 1、Jedis【了解】 jedis是redis的java版本的客户端实现&#xff0c;jedis中提供了针对redis命令的操作 1.1导入jar文件 Maven方式 <dependency><group…

SoC芯片中Clock Gen和Reset Gen的时钟树综合

社区目前已经开设了下面列举的前四大数字后端实战课程&#xff0c;均为直播课&#xff0c;且均是小编本人亲自授课&#xff01;遇到项目问题&#xff0c;都可以远程一对一指导解决具体问题。小编本人是一线12年后端经验的数字后端工程师。想找一线IC后端技术专家亲自带你做后端…

【C语言】动态内存管理(下)

本篇博客将讲解以下知识&#xff1a; 1、calloc和realloc 2、常见的动态内存错误 1、calloc和realloc &#xff08;1&#xff09;calloc C语言中还提供了一个函数叫calloc&#xff0c;calloc也用来动态内存分配 calloc函数原型&#xff1a; void* calloc(size_t num, …