美文网首页
LeetCode:433. 最小基因变化

LeetCode:433. 最小基因变化

作者: alex很累 | 来源:发表于2022-08-21 20:11 被阅读0次

    问题链接

    433. 最小基因变化

    问题描述

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

    示例

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

    解题思路

    可以用广度优先搜索的思路进行解题,尝试所有可能的基因变化,直到找到最少的变化次数。

    代码示例(JAVA)

    class Solution {
        public static int minMutation(String start, String end, String[] bank) {
            Set<String> bankSet = new HashSet<>();
            Set<String> visited = new HashSet<>();
            for (String str : bank) {
                bankSet.add(str);
            }
            // 如果end不在bank中,无法完成
            if (!bankSet.contains(end)) {
                return -1;
            }
            // 如果 start = end,返回0
            if (start.equals(end)) {
                return 0;
            }
    
            char[] chars = {'A', 'C', 'G', 'T'};
            int count = 0;
            Queue<String> queue = new LinkedList<>();
            queue.offer(start);
            while (!queue.isEmpty()) {
                count++;
                int curSize = queue.size();
                for (int i = 1; i <= curSize; i++) {
                    String str = queue.poll();
                    for (int j = 0; j < 8; j++) {
                        for (int z = 0; z <= 3; z++) {
                            if (str.charAt(j) != chars[z]) {
                                StringBuilder newStr = new StringBuilder(str);
                                newStr.setCharAt(j, chars[z]);
                                if (!visited.contains(newStr.toString()) && bankSet.contains(newStr.toString())) {
                                    // 和end匹配上了
                                    if (end.equals(newStr.toString())) {
                                        return count;
                                    }
                                    queue.offer(newStr.toString());
                                    visited.add(newStr.toString());
                                }
                            }
                        }
                    }
                }
            }
    
            return -1;
        }
    }
    

    相关文章

      网友评论

          本文标题:LeetCode:433. 最小基因变化

          本文链接:https://www.haomeiwen.com/subject/emxbgrtx.html