首页 > 编程语言 >【优选算法】(第四十二篇)

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

时间:2024-10-15 12:46:59浏览次数:3  
标签:wordList 优选 hash int 算法 beginWord 四十二篇 endWord bank

目录

最⼩基因变化(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;
 }
}

标签:wordList,优选,hash,int,算法,beginWord,四十二篇,endWord,bank
From: https://blog.csdn.net/weixin_73861555/article/details/142946481

相关文章

  • 21岁,在大模型独角兽当算法实习生!
    转眼间也实习半年了,浅浅分享一下在智谱面试的经验吧!大模型算法面试题整理1、现在的大语言模型为什么基本都用decoder-only结构?2、训练一个大语言模型的整条路线是什么?介绍下LoRA、Adapter、prefix-tuningP-tuning和Prompt-tuning?你觉得OPENAI对齐为什么要用强化学......
  • 【路径规划】一种考虑拥塞的改进路径规划算法[CCPF-RRT*](Matlab代码实现)
    ......
  • 【储能选址定容】基于多目标粒子群算法的配电网储能选址定容(Matlab代码实现)
     ......
  • Snowflake算法js(实现)
    Snowflake算法是一种分布式环境下的唯一ID生成算法,最初由Twitter开发并在其内部使用。该算法旨在生成全局唯一、递增的64位整数ID,同时具备高性能的特点。以下是Snowflake算法的一些关键特点及其工作原理:特点全局唯一性:生成的ID在分布式环境中几乎可以保证全局唯一。时间有......
  • LeetCode刷题日记之回溯算法(四)
    目录前言非递减子序列全排列全排列II总结前言今天是学习回溯算法的第四天,我们继续来一起学习回溯算法蕴含的逻辑处理,希望博主记录的内容能够对大家有所帮助,一起加油吧朋友们!......
  • 素数筛法算法
    素数定义:素数是指在大于1的自然数中,除了1和它本身外,没有其他因数的数。换句话说,素数只有两个正因数:1和它本身。注意:0和1既不是质数也不是合数。inlineboolisprime(intx){for(inti=2;i<=x-1;++i){if(x%i==0)return0;return1;}}in......
  • (递归)算法
    递归条件:1.终止条件,当满足这个条件时,递归将停止并返回一个值,这个条件是为了防止函数无限递归,导致栈溢出。2.递归条件,这个是函数调用自身的地方,通常是通过将问题分解为更小的子问题来解决。例如求n的阶乘:deffactorial(n):#基线条件ifn==0:return1......
  • 【机器学习(五)】分类和回归任务-AdaBoost算法-Sentosa_DSML社区版
    @目录一、算法概念一、算法原理(一)分类算法基本思路1、训练集和权重初始化2、弱分类器的加权误差3、弱分类器的权重4、Adaboost分类损失函数5、样本权重更新6、AdaBoost的强分类器(二)回归算法基本思路1、最大误差的计算2、相对误差计算3、误差损失调整4、权重系数计算5、更新样本......
  • 【机器学习(七)】分类和回归任务-K-近邻 (KNN)算法-Sentosa_DSML社区版
    @目录一、算法概念二、算法原理(一)K值选择(二)距离度量1、欧式距离2、曼哈顿距离3、闵可夫斯基距离(三)决策规则1、分类决策规则2、回归决策规则三、算法优缺点优点缺点四、KNN分类任务实现对比(一)数据加载和样本分区1、Python代码2、Sentosa_DSML社区版(二)训练模型1、Python代码2、Sento......
  • 【机器学习(六)】分类和回归任务-LightGBM算法-Sentosa_DSML社区版
    @目录一、算法概念二、算法原理(一)Histogram(二)GOSS1、信息增益2、近似误差(三)EFB三、算法优缺点(一)优点(二)缺点四、LightGBM分类任务实现对比(一)数据加载和样本分区1、Python代码2、Sentosa_DSML社区版(二)模型训练1、Python代码2、Sentosa_DSML社区版(三)模型评估和模型可视化1、Python代......