สมมติว่าเรามีสายยีน ที่สามารถแสดงด้วยสตริงที่มีความยาวเท่ากับ 8 สตริงนี้ประกอบด้วยตัวอักษรเหล่านี้ [A, C, G, T] ตอนนี้ ให้พิจารณาว่าเราต้องการตรวจสอบเกี่ยวกับการกลายพันธุ์ โดยที่การกลายพันธุ์ ONE ครั้งนั้นเป็น ONE อักขระเดียวที่เปลี่ยนแปลงในสายยีน ตัวอย่างเช่น "AACCGTTT" มีการเปลี่ยนแปลงเหมือน "AACCGTTA" เป็นการกลายพันธุ์ 1 ครั้ง
นอกจากนี้เรายังมี "ธนาคาร" ของยีนที่กำหนดซึ่งมีการกลายพันธุ์ของยีนที่ถูกต้องทั้งหมด ยีนต้องอยู่ในธนาคารเพื่อให้เป็นสตริงยีนที่ถูกต้อง
สมมติว่าเราได้ให้ 3 สิ่ง - เริ่มต้น สิ้นสุด ธนาคาร งานของเราคือกำหนดจำนวนการกลายพันธุ์ขั้นต่ำที่จำเป็นในการกลายพันธุ์จาก "เริ่มต้น" เป็น "สิ้นสุด" หากไม่สามารถแปลงตั้งแต่ต้นจนจบได้ ให้คืนค่า -1
ดังนั้น หากอินพุตเป็น start ="AACCGGTT", end ="AAACGGTA", bank =["AACCGGTA", "AACCGCTA", "AAACGGTA"] เอาต์พุตจะเป็น 2
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดฟังก์ชัน putStar() ซึ่งจะใช้เวลา s
-
กำหนดอาร์เรย์ ret
-
สำหรับการเริ่มต้น i :=0 เมื่อ i ≪ ขนาดของ s ให้อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
temp :=สตริงย่อยของ s จาก 0 ถึง i-1 ต่อ " * " + สตริงย่อยของ s จากดัชนี i + 1 ถึงสิ้นสุด
-
ใส่ temp ที่ท้าย ret
-
-
รีเทิร์น
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
กำหนดหนึ่งแผนที่เรียกว่ากราฟ
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของธนาคาร ให้อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
s :=ธนาคาร[i]
-
ออก =putStar(ธนาคาร[i])
-
สำหรับการเริ่มต้น j :=0 เมื่อ j
-
แทรก s ที่ท้ายกราฟ[out[j]]
-
-
-
กำหนดหนึ่งคิว q
-
แทรก start ลงใน q
-
กำหนดการเยี่ยมชมหนึ่งชุด
-
แทรกเริ่มต้นในการเยี่ยมชม
-
สำหรับการเริ่มต้น lvl :=1 เมื่อไม่มี q ว่าง ให้อัปเดต (เพิ่ม lvl ขึ้น 1) ทำ -
-
sz :=ขนาดของ q
-
ในขณะที่ sz ไม่ใช่ศูนย์ ให้ลด sz ในการวนซ้ำแต่ละครั้ง ทำ -
-
โหนด :=องค์ประกอบแรกของ q
-
ลบองค์ประกอบออกจาก q
-
ออก =putStar(โหนด)
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
u :=ออก[i]
-
สำหรับการเริ่มต้น j :=0 เมื่อ j <ขนาดของกราฟ[u] อัปเดต (เพิ่ม j โดย 1) ทำ -
-
v :=กราฟ[u, j]
-
ถ้า vi ถูกเยี่ยม ให้ออกจากวง
-
ถ้า v เหมือนกับ end ให้กลับ lvl
-
ใส่ v เข้าไป
-
แทรก v ลงใน q
-
-
-
-
-
กลับ -1
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
vector <string> putStar(string s){
vector <string> ret;
for(int i = 0; i < s.size(); i++){
string temp = s.substr(0, i) + "*" + s.substr(i + 1);
ret.push_back(temp);
}
return ret;
}
int minMutation(string start, string end, vector<string>& bank) {
unordered_map < string, vector <string> > graph;
for(int i = 0; i < bank.size(); i++){
string s = bank[i];
vector <string> out = putStar(bank[i]);
for(int j = 0; j < out.size(); j++){
graph[out[j]].push_back(s);
}
}
queue <string> q;
q.push(start);
set <string> visited;
visited.insert(start);
for(int lvl = 1; !q.empty(); lvl++){
int sz = q.size();
while(sz--){
string node = q.front();
q.pop();
vector <string> out = putStar(node);
for(int i = 0; i < out.size(); i++){
string u = out[i];
for(int j = 0; j < graph[u].size(); j++){
string v = graph[u][j];
if(visited.count(v)) continue;
if(v == end) return lvl;
visited.insert(v);
q.push(v);
}
}
}
}
return -1;
}
};
main(){
Solution ob;
vector<string> v = {"AACCGGTA", "AACCGCTA", "AAACGGTA"};
cout << (ob.minMutation("AACCGGTT", "AAACGGTA", v));
} อินพุต
"AACCGGTT", "AAACGGTA", {"AACCGGTA", "AACCGCTA", "AAACGGTA"} ผลลัพธ์
2