কম্পিউটার

C++ এ বারবার ডিএনএ সিকোয়েন্স


ধরুন আমাদের একটি ডিএনএ সিকোয়েন্স আছে। আমরা জানি, সমস্ত 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, ]

  1. প্রদত্ত দৈর্ঘ্যের সমস্ত সিকোয়েন্স C++ এ প্রিন্ট করুন

  2. C++ এ বারবার সাবস্ট্রিং প্যাটার্ন

  3. C++ এ একটি স্ট্রিং-এ প্রথমে উপস্থিত বারবার অক্ষর খুঁজুন

  4. লিনাক্সে C++ এর সেরা IDE কি?