Leetcode 433. 最小基因变化 C++

Leetcode 433. 最小基因变化

题目

一条基因序列由一个带有8个字符的字符串表示,其中每个字符都属于 “A”, “C”, “G”, "T"中的任意一个。

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

例如,基因序列由"AACCGGTT" 变化至 “AACCGGTA” 即发生了一次基因变化。

与此同时,每一次基因变化的结果,都需要是一个合法的基因串,即该结果属于一个基因库。

现在给定3个参数 — start, end, bank,分别代表起始基因序列,目标基因序列及基因库,请找出能够使起始基因序列变化为目标基因序列所需的最少变化次数。如果无法实现目标变化,请返回 -1。

注意:
  1. 起始基因序列默认是合法的,但是它并不一定会出现在基因库中。
  2. 所有的目标基因序列必须是合法的。
  3. 假定起始基因序列与目标基因序列是不一样的。

测试样例

示例 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

题解

bfs
变异当前的基因序列,只允许一个位置的基因发生突变,且突变后的的基因序列应在基因库中。详细过程见代码

代码

	bool canChange(string& s1,string& s2){		//
        int cnt = 0,len=s1.length();
        for(int i=0; i<len; i++){		
            if(s1[i] != s2[i])  cnt++;
            if(cnt>1)   return false;
        }
        return cnt == 1;
    }
    int minMutation(string start, string end, vector<string>& bank) {
        int n = bank.size();
        unordered_set<string> list(bank.begin(),bank.end());
        if(list.find(end) == list.end())    return -1;
        vector<int> use(n,0);
        queue<string> q;
        q.push(start);
        int size,ans=-1;
        bool flag = false;
        while(!flag && !q.empty()){
            size = q.size();
            ans++;
            while(size--){
                string now = q.front();
                q.pop();
                if(now == end){
                    flag = true;
                    break;
                }
                for(int i=0; i<n; i++){
                    if(use[i] == 0 && canChange(now,bank[i])){		//在基因库中找一个只发生一次突变的基因序列
                        q.push(bank[i]);
                        use[i] = 1;
                    }
                }
            }
        }
        if(!flag)   return -1;
        else    return ans;
    }

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/minimum-genetic-mutation
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值