433. 最小基因变化

基因序列可以表示为一条由 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
  • startend 和 bank[i] 仅由字符 ['A', 'C', 'G', 'T'] 组成

解题思路

  1. 整体思想是广度优先搜索
  2. 由于原序列变化一个字符不一定是针对endGene精确修改的,可能把对的字符暂时修改为了符合基因库里面的序列,再修改成符合endGene的序列,所以每个出队的序列要接受24次修改,为什么不是32次,因为相同字符保持不变即可
  3. 用到map集合记录每种序列的变化次数
  4. 在修改序列时要不断判断该序列是否为endGene,最先到达endGene为最少步骤的序列
    1. 是,则直接返回map中的值加一,若map为空则返回1
    2. 否,则继续从队列取
  5. 若出队完,还没修改出最终序列,说明基因库不存在某个序列导致某一步截止了,则返回-1
  6. existBank用于判断当前序列是否存在于基因库
  7. isPoll用于判断是否已经出队过一次
public int minMutation(String startGene, String endGene, String[] bank) {
        Set existBank=new HashSet();
        Set isPoll=new HashSet();
        MapminStep=new HashMap();
        for (int i = 0; i queue=new LinkedList();
        char[] start = startGene.toCharArray();
        char[] end = endGene.toCharArray();
        queue.offer(start);
        char cs[]=new char[]{'A','C','G','T'};
        while (!queue.isEmpty()){
            char[] current = queue.poll();
            String currentStr=String.valueOf(current);
            if(!isPoll.contains(currentStr)){
                isPoll.add(currentStr);
            }else{
                continue;
            }
            if(currentStr.equals(String.valueOf(end))){
                return minStep.get(currentStr);
            }
            for (int i = 0; i 

你可能感兴趣的:(Java基础,算法,算法,数据结构,java)