ধরুন আমাদের কাছে জিন নামক স্ট্রিংগুলির একটি তালিকা রয়েছে যেখানে প্রতিটি উপাদানের দৈর্ঘ্য একই এবং প্রতিটি উপাদানে "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