สมมติว่าเรามีรายการสตริงที่เรียกว่ายีน ซึ่งแต่ละองค์ประกอบมีความยาวเท่ากัน และแต่ละองค์ประกอบมีอักขระ "A", "C", "G" และ/หรือ "T" ตอนนี้มีกฎบางอย่าง -
-
เมื่อสองสตริง s1 และ s2 เป็นสตริงเดียวกันยกเว้นหนึ่งอักขระ ดังนั้น s1 และ s2 จะอยู่ในกลุ่มการกลายพันธุ์เดียวกัน
-
เมื่อสองสตริง s1 และ s2 อยู่ในกลุ่ม และ s2 และ s3 อยู่ในกลุ่ม ดังนั้น s1 และ s3 จะอยู่ในกลุ่มเดียวกัน
เราต้องหาจำนวนกลุ่มการกลายพันธุ์ทั้งหมดที่เราสามารถสร้างได้
ดังนั้นหากอินพุตเป็นเหมือนยีน =["ACGT", "ACGC", "ACTT", "TTTT", "TGTT"] ผลลัพธ์จะเป็น 2 เนื่องจาก มีกลุ่มการกลายพันธุ์สองกลุ่ม:["ACGT", "ACGC", "ACTT"] และ ["TTTT", "TTTG"]
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดหนึ่งแผนที่ที่เรียกว่าพาเรนต์
-
กำหนดฟังก์ชัน getPar() ซึ่งจะใช้ a,
-
ถ้า parent[a] เหมือนกับ a แล้ว:
-
กลับ
-
-
parent[a] =getPar(พาเรนต์[a])
-
ส่งคืนพาเรนต์[a]
-
กำหนดฟังก์ชัน unite() ซึ่งจะใช้ a, b,
-
parA :=getPar(a), parB :=getPar(b)
. พาร์ -
ถ้า parA ไม่เท่ากับ parB ดังนั้น:
-
ผู้ปกครอง[parA] :=parB
-
คืนความจริง
-
-
คืนค่าเท็จ
-
กำหนดฟังก์ชัน ok() ซึ่งจะใช้เวลา a, b,
-
cnt :=0
-
สำหรับการเริ่มต้น i :=0 เมื่อ i
-
cnt :=cnt + (1 เมื่อ a[i] ไม่เหมือนกับ b[i] มิฉะนั้น 0)
-
-
คืนค่า จริง เมื่อ cnt เป็น 1 มิฉะนั้น เท็จ
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
จัดเรียงอาร์เรย์ v
-
กำหนดหนึ่งชุดโดยนำองค์ประกอบจาก v
-
ret :=ขนาดของวี
-
สำหรับแต่ละองค์ประกอบใน v ทำ
-
parent[it] :=มัน
-
สำหรับแต่ละองค์ประกอบใน v ทำ
-
สำหรับการเริ่มต้น j :=0 เมื่อ j <ขนาดของมัน ให้อัปเดต (เพิ่ม j ขึ้น 1) ให้ทำ:
-
อุณหภูมิ :=มัน
-
สำหรับแต่ละอักขระ x ใน [A, C, G, T]
-
ถ้า x ไม่เท่ากับมัน[j] แล้ว:
-
อุณหภูมิ[j] :=x
-
ถ้า temp มีอยู่ใน s แล้ว:
-
ถ้ารวมกัน (ชั่วคราว มัน) แล้ว:
-
-
-
-
รีเทิร์น
-
-
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: map <string, string> parent; string getPar(string& a){ if(parent[a] == a) return a; return parent[a] = getPar(parent[a]); } bool unite(string& a, string& b){ string parA = getPar(a); string parB = getPar(b); if(parA != parB){ parent[parA] = parB; return true; } return false; } bool ok(string &a, string& b){ int cnt = 0; for(int i = 0; i < a.size(); i++){ cnt += a[i] != b[i]; } return cnt == 1; } int solve(vector<string> v) { sort(v.begin(), v.end()); set <string> s(v.begin(), v.end()); int ret = v.size(); for(auto& it : v){ parent[it]= it; } for(auto& it : v){ for(int j = 0; j < it.size(); j++){ string temp = it; for(char x : {'A', 'C', 'G', 'T'}){ if(x != it[j]){ temp[j] = x; if(s.count(temp)){ if(unite(temp, it)) ret--; } } } } } return ret; } }; main(){ vector<string> v = {"ACGT", "ACGC", "ACTT", "TTTT", "TGTT"}; Solution(ob); cout << ob.solve(v); }
อินพุต
{"ACGT", "ACGC", "ACTT", "TTTT", "TGTT"}
ผลลัพธ์
2