BFS逛街算法模板-附LeetCode习题-433. 最小基因变化-广度优先搜索

433. 最小基因变化

难度中等173收藏分享切换为英文接收动态反馈

基因序列可以表示为一条由 8 个字符组成的字符串,其中每个字符都是 'A''C''G' 和 'T' 之一。

假设我们需要调查从基因序列 start 变为 end 所发生的基因变化。一次基因变化就意味着这个基因序列中的一个字符发生了变化。

  • 例如,"AACCGGTT" --> "AACCGGTA" 就是一次基因变化。

另有一个基因库 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
  • startend 和 bank[i] 仅由字符 ['A', 'C', 'G', 'T'] 组成

解题思路:BFS广度优先搜索

Python代码:

class Solution:
    def minMutation(self, start: str, end: str, bank: List[str]) -> int:
        
        if start==end: return 0
        if end not in bank: return -1
        nums = ['A', 'C', 'G', 'T']
        ans = deque([(start, 0)])
        
        while ans:
            str1 , index1 = ans.popleft()
            for i , j in enumerate(str1):
                for t in nums:
                    if t!=j:
                        ads = str1[:i] + t + str1[i+1:]
                        if ads in bank:
                            if ads == end:
                                return index1+1
                            bank.remove(ads)
                            ans.append([ads , index1+1])
        return -1



            

C++代码:

class Solution {
public:
    int minMutation(string start, string end, vector& bank) {
        if (start==end) return 0;
        unordered_set ans;
        unordered_set ads;
        char key[4] = {'A', 'C', 'G', 'T'};
        for (auto &i: bank) ans.emplace(i);
        if (!ans.count(end)) return -1;
        queue deque1;
        deque1.emplace(start);
        ads.emplace(start);
        int step = 1; 
        while(!deque1.empty()){

            int wc = deque1.size();
            for (int i=0; i

你可能感兴趣的:(C++语法,数据结构与算法,笔记,算法,leetcode,宽度优先)