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

C++ में दोहराए गए DNA अनुक्रम


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

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

उदाहरण के लिए, यदि इनपुट "AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT" है, तो आउटपुट ["AAAAACCCCC", "CCCCCAAAAA"] होगा।

हल करने के चरण

  • ret नामक एक सरणी परिभाषित करें, n := s का आकार, visited और visited2 नामक दो सेट बनाएं

  • bitVal नामक एक मैप परिभाषित करें

  • ACGT के लिए संबंधित मान 0,1,2,3 bitVal में स्टोर करें

  • mask := 0

  • i को 0 से n-1 तक लूप करें

    • mask := mask * 4

    • mask := mask OR bitVal[s[i]]

    • mask := mask AND 0xFFFFF

    • यदि i < 9, तो अगले इटरेशन पर जाएं

      • इंडेक्स i-9 से 10 लंबाई का उपस्ट्रिंग ret में डालें

      • mask को visited2 में डालें

    • mask को visited में डालें

  • 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++ में दोहराए गए उपस्ट्रिंग पैटर्न (Repeated Substring Pattern)

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

  1. - स्ट्रिंग में पहले आने वाला दोहराया गया वर्ण खोजें C++ में

    मान लीजिए हमारे पास एक स्ट्रिंग है; हमें पहला वर्ण खोजना है जो दोहराया गया हो। तो यदि स्ट्रिंग Hello Friends है, तो पहला दोहराया गया वर्ण l होगा। क्योंकि दो l एक के बाद एक हैं। इसे हल करने के लिए, हम हैशिंग तकनीक का उपयोग करेंगे। एक हैश टेबल बनाएं, प्रत्येक वर्ण को एक-एक करके स्कैन करें, यदि वर्ण मौ

  1. - लिनक्स पर C++ के लिए सर्वश्रेष्ठ IDE कौन सा है?

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