【力扣】最小基因变化

该博客讨论了如何通过广度优先搜索(BFS)算法解决LeetCode上的一个问题——寻找基因序列的最短变化路径。在给定的基因库中,从起始基因序列开始,每次变化只能改变一个碱基,目标是找到到达特定基因序列的最短变化次数。博主通过创建一个图并利用BFS找到从起点到终点的最短路径,如果目标基因不在库中则返回-1。
摘要由CSDN通过智能技术生成

题目链接:https://leetcode-cn.com/problems/minimum-genetic-mutation/

// start-end 每一次有效的基因变化后的基因序列 都是start->end的一个状态
//最短编辑距离的问题 抽象为边权为1的图上的最短路问题  使用BFS求解

//bank中的状态可以看作是图上的节点,因为需要保证 每次变化后的状态都在bank中
//两个状态如果只相差一个字符,说明这两个节点是相邻的
//从start出发,BFS逐层遍历图上的每一个节点,为了方便 直接将遍历完成的节点在bankSet删除即可
//第一次遍历到终点的时候,所花费的变化数一定是最小的(BFS中 肯定是层数越少 距离越短)
func minMutation(start string, end string, bank []string) int {
	//无需转换 次数为0
	if start == end {
		return 0
	}
	//将所有的bank中的序列存入map中 这一步只是便于查找,只会使用到key, value不重要
	bankSet := map[string]interface{}{}
	for _, s := range bank{
		bankSet[s] = nil
	}
	//end不是合法的基因序列
	if _, ok := bankSet[end]; !ok {
		return -1
	}
	//声明一个队列queue 存放当前节点的所有相邻节点
	queue := []string{start}
	for step := 0; queue != nil; step++ {
		//BFS 对当前节点进行BFS
		tmp := queue
		queue = nil
		for _, cur := range tmp {
			//找出当前节点的所有相连的边 和bank中只相差一个字符的字符串
			for index, x := range cur {
				for _, y := range "ACGT" {
					if x != y {
						after := cur[:index] + string(y) + cur[index+1:]
						if _, ok := bankSet[after]; ok {
							//找到了相邻的节点
							if after == end {
								return step + 1
							}
							//将已经遍历的节点删掉
							delete(bankSet, after)
							queue = append(queue, after)

						}
					}
				}
			}

		}

	}
	return -1
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值