Computer >> कंप्यूटर >  >> प्रोग्रामिंग >> C++

C++ में बार-बार डीएनए अनुक्रम


मान लीजिए कि हमारे पास डीएनए अनुक्रम है। जैसा कि हम जानते हैं, सभी डीएनए ए, सी, जी, और टी जैसे संक्षिप्त न्यूक्लियोटाइड की एक श्रृंखला से बना है, उदाहरण के लिए:"एसीजीएएटीटीसीसीजी"। जब हम डीएनए का अध्ययन कर रहे होते हैं, तो कभी-कभी डीएनए के भीतर दोहराए गए अनुक्रमों की पहचान करना उपयोगी होता है।

डीएनए अणु में एक से अधिक बार आने वाले सभी 10-अक्षर-लंबे अनुक्रम (सबस्ट्रिंग) को खोजने के लिए हमें एक विधि लिखनी होगी।

इसलिए यदि इनपुट "AAAAACCCCCAAAAACCCCCAAAAAGGGTTT" जैसा है, तो आउटपुट ["AAAAACCCCCC", "CCCCCAAAAA"] होगा।

इसे हल करने के लिए, हम इन चरणों का पालन करेंगे -

  • एक सरणी रिट परिभाषित करें, n :=s का आकार, दो सेट बनाएं जिन्हें विज़िट किया गया और विज़िट किया गया2

    कहा जाता है
  • बिटवैल नामक मानचित्र को परिभाषित करें।

  • एसीजीटी के लिए 0123 जैसे संबंधित मानों को butVal में संग्रहित करें।

  • मुखौटा :=0

  • मैं के लिए 0 से n - 1 की सीमा में

    • मुखौटा:=मुखौटा * 4

    • मुखौटा:=मस्तूल या बिटवैल [s[i]]

    • मुखौटा:=मुखौटा और एफएफएफएफएफ

    • अगर मैं <9, तो बस अगले पुनरावृत्ति के लिए जारी रखें

      • सबस्ट्रिंग फॉर्म इंडेक्स i - 9 से 9, रिट में डालें

      • विज़िट किए गए2 में चिह्न डालें.

    • विज़िट किए गए में मास्क डालें

  • वापसी रिट

उदाहरण(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++ में बार-बार सबस्ट्रिंग पैटर्न

    मान लीजिए कि हमारे पास एक गैर-रिक्त स्ट्रिंग है। हमें यह जांचना होगा कि क्या इसका एक सबस्ट्रिंग लेकर और सबस्ट्रिंग के कई बार जोड़कर इसका निर्माण किया जा सकता है। स्ट्रिंग में केवल लोअरकेस अंग्रेजी अक्षर होते हैं और इसकी लंबाई 10000 से अधिक नहीं होगी। इसलिए यदि इनपुट अबाबाबा जैसा है, तो उत्तर सही होग

  1. C++ में एक स्ट्रिंग में पहले मौजूद दोहराए गए वर्ण का पता लगाएं

    मान लीजिए हमारे पास एक स्ट्रिंग है; हमें दोहराए जाने वाले पहले चरित्र को ढूंढना होगा। तो स्ट्रिंग हैलो फ्रेंड्स है, पहला दोहराया जाने वाला वर्ण l होगा। जैसा कि एक के बाद एक दो होते हैं। इसे हल करने के लिए, हम हैशिंग तकनीक का उपयोग करेंगे। एक हैश तालिका बनाएं, प्रत्येक वर्ण को एक-एक करके स्कैन करें,

  1. Linux पर C++ का सबसे अच्छा IDE क्या है?

    केवल टेक्स्ट एडिटर्स पर बड़े प्रोजेक्ट्स को मैनेज करना मुश्किल है। यदि आप ऐसे मामलों में आईडीई का उपयोग करते हैं तो आप अधिक उत्पादक और कम निराश होने की संभावना रखते हैं। विभिन्न प्रकार के आईडीई हैं और आपको अपनी आवश्यकताओं के अनुरूप सही का चयन करना चाहिए। Linux पर C++ के लिए एक भी सर्वश्रेष्ठ IDE नही