題目:
一條基因序列由一個帶有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
代碼:
class Solution {
public:
//bfs
map<string,int>vis;
int ans = 0;
bool isAble(string a,string b)
{
int flag = 0;
for(int i = 0;i<a.size();i++)
{
if(a[i] - b[i] != 0)
flag++;
}
return flag == 1;
}
int minMutation(string start, string end, vector<string>& bank) {
queue<string>q;
q.push(start);
vis[start] = 0;
while(!q.empty())
{
string tmp = q.front();
q.pop();
if(tmp == end) return vis[tmp];
for(int i = 0;i<bank.size();i++)
{
if(vis.count(bank[i]) == 0 && isAble(tmp,bank[i]))
{
vis[bank[i]] = vis[tmp]+1;
q.push(bank[i]);
}
}
}
return -1;
}
};