Leetcode 433. 最小基因变化
题目
一条基因序列由一个带有8个字符的字符串表示,其中每个字符都属于 “A”, “C”, “G”, "T"中的任意一个。
假设我们要调查一个基因序列的变化。一次基因变化意味着这个基因序列中的一个字符发生了变化。
例如,基因序列由"AACCGGTT" 变化至 “AACCGGTA” 即发生了一次基因变化。
与此同时,每一次基因变化的结果,都需要是一个合法的基因串,即该结果属于一个基因库。
现在给定3个参数 — start, end, bank,分别代表起始基因序列,目标基因序列及基因库,请找出能够使起始基因序列变化为目标基因序列所需的最少变化次数。如果无法实现目标变化,请返回 -1。
注意:
- 起始基因序列默认是合法的,但是它并不一定会出现在基因库中。
- 所有的目标基因序列必须是合法的。
- 假定起始基因序列与目标基因序列是不一样的。
测试样例
示例 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
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。