最小基因变化(BFS)

该博客主要介绍了如何运用广度优先搜索(BFS)算法解决从给定起始基因序列到目标基因序列的最短变异步数问题。在代码实现中,通过队列进行BFS搜索,利用HashSet存储已访问节点,避免回溯,并在找到目标序列时返回步数。如果目标序列不在基因库中或者无法达到,则返回-1。此方法适用于生物信息学中的基因序列分析。
摘要由CSDN通过智能技术生成

在这里插入图片描述
经典的BFS暴力搜索的题目,使用一个队列进行BFS搜索即可,到达终点即返回step。
有一点需要注意,走完一层算一步。
为了不走回头路使用HashSet去存储走过的节点。
总体代码如下:

class Solution {
    public int minMutation(String start, String end, String[] bank) {
      HashSet<String> bank_set = new HashSet<>();
        HashSet<String> visited = new HashSet<>();
        char[] cs = new char[]{'A','C','G','T'};
        for(int i = 0 ; i < bank.length ; i++)
        {
            bank_set.add(bank[i]);
        }
        if(!bank_set.contains(end))
            return -1;
        if (start.equals(end)) {
            return 0;
        }
        Queue<String> ans = new ArrayDeque<>();
        int step = 1;
        ans.offer(start);
        visited.add(start);
        while (!ans.isEmpty())
        {
            
            int size = ans.size();
            for(int r = 0 ; r < size ;r++)
            {
                String temp = ans.poll();
                for(int i = 0 ; i < 8 ; i++)
                {
                    for (char c: cs)
                    {
                        if(c != temp.charAt(i))
                        {
                            StringBuilder tt = new StringBuilder(temp);
                            tt.setCharAt(i , c);
                            String tem = tt.toString();
                            if(bank_set.contains(tem) && !visited.contains(tem))
                            {
                                if(tem.equals(end))
                                    return step;
                                visited.add(tem);
                                ans.offer(tem);
                            }
                        }
                    }
                }
            }
            step++;
        }
        return -1;
    }
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鱼qss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值