ধরুন আমাদের কাছে জিন নামক স্ট্রিংগুলির একটি তালিকা রয়েছে যেখানে প্রতিটি উপাদানের দৈর্ঘ্য একই এবং প্রতিটি উপাদানে "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] a এর মতো হয়, তাহলে:
-
একটি ফেরত দিন
-
-
পিতামাতা[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 হলে true ফেরত দিন, অন্যথায় মিথ্যা
-
প্রধান পদ্ধতি থেকে নিম্নলিখিতগুলি করুন -
-
অ্যারে সাজান v
-
v
থেকে উপাদান নিয়ে একটি সেট s সংজ্ঞায়িত করুন -
ret :=v
এর আকার -
প্রতিটি উপাদানের জন্য এটি v, করুন
-
পিতামাতা[এটি] :=এটি
-
প্রতিটি উপাদানের জন্য এটি v, করুন
-
আরম্ভ করার জন্য j :=0, যখন j <এর আকার, আপডেট করুন (j 1 দ্বারা বৃদ্ধি করুন), করুন:
-
তাপমাত্রা :=এটা
-
প্রতিটি অক্ষরের জন্য x [A, C, G, T]
-
যদি x এর সমান না হয় [j], তাহলে:
-
তাপমাত্রা [j] :=x
-
যদি temp s তে থাকে, তাহলে:
-
যদি একত্রিত হয়(temp, it), তারপর:
-
-
-
-
রিটার্ন রিটার্ন
-
-
আরো ভালোভাবে বোঝার জন্য আসুন নিচের বাস্তবায়ন দেখি -
উদাহরণ
#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