ধরুন আমাদের একটি ডিএনএ সিকোয়েন্স আছে। আমরা জানি, সমস্ত DNA সংক্ষেপে A, C, G, এবং T-এর মতো নিউক্লিওটাইডের একটি সিরিজ দিয়ে গঠিত, উদাহরণস্বরূপ:"ACGAATTCCG"। যখন আমরা ডিএনএ অধ্যয়ন করি, তখন কখনও কখনও ডিএনএ-র মধ্যে পুনরাবৃত্তি ক্রমগুলি সনাক্ত করা কার্যকর হয়৷
ডিএনএ অণুতে একাধিকবার ঘটে এমন সমস্ত 10-অক্ষর-দীর্ঘ সিকোয়েন্স (সাবস্ট্রিং) খুঁজে পেতে আমাদের একটি পদ্ধতি লিখতে হবে।
তাই ইনপুট যদি হয় “AAAAACCCCCAAACCCCCCAAAAAAGGGTTT”, তাহলে আউটপুট হবে ["AAAAACCCCC", "CCCCCAAAAA"]।
এটি সমাধান করতে, আমরা এই পদক্ষেপগুলি অনুসরণ করব -
-
একটি অ্যারে ret সংজ্ঞায়িত করুন, n :=s এর আকার, ভিজিটেড এবং ভিজিটেড2 নামে দুটি সেট তৈরি করুন
-
বিটভাল নামে একটি মানচিত্র সংজ্ঞায়িত করুন।
-
ACGT-এর জন্য 0123-এর মতো সংশ্লিষ্ট মানগুলি butVal-এ সঞ্চয় করুন।
-
মুখোশ :=0
-
0 থেকে n – 1
রেঞ্জের i জন্য-
মুখোশ :=মাস্ক * 4
-
মুখোশ :=মাস্ট বা বিটভাল[s[i]]
-
মুখোশ :=মাস্ক এবং FFFFF
-
যদি আমি <9, তাহলে শুধু পরবর্তী পুনরাবৃত্তি চালিয়ে যান
-
সাবস্ট্রিং ফর্ম ইনডেক্স i – 9 থেকে 9, ret এ সন্নিবেশ করুন
-
ভিজিটেড২-এ চিহ্ন সন্নিবেশ করান।
-
-
ভিজিটেড
এ মাস্ক ঢোকান
-
-
রিটার্ন রিটার্ন
উদাহরণ(C++)
আরো ভালোভাবে বোঝার জন্য নিচের বাস্তবায়নটি দেখি -
#include <bits/stdc++.h>
using namespace std;
void print_vector(vector<auto> v){
cout << "[";
for(int i = 0; i<v.size(); i++){
cout << v[i] << ", ";
}
cout << "]"<<endl;
}
typedef long long int lli;
class Solution {
public:
vector<string>findRepeatedDnaSequences(string s) {
vector <string> ret;
int n = s.size();
set <int> visited;
set <int> visited2;
map <char, int> bitVal;
bitVal['A'] = 0;
bitVal['C'] = 1;
bitVal['G'] = 2;
bitVal['T'] = 3;
lli mask = 0;
for(int i = 0; i < n; i++){
mask <<= 2;
mask |= bitVal[s[i]];
mask &= 0xfffff;
if(i < 9) continue;
if(visited.count(mask) && !visited2.count(mask)){
ret.push_back(s.substr(i - 9, 10));
visited2.insert(mask);
}
visited.insert(mask);
}
return ret;
}
};
main(){
Solution ob;
print_vector(ob.findRepeatedDnaSequences("AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"));
} ইনপুট
"AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT"
আউটপুট
[AAAAACCCCC, CCCCCAAAAA, ]