C ++
 Computer >> コンピューター >  >> プログラミング >> C ++

C++で繰り返されるDNA配列


DNA配列があるとします。ご存知のように、すべてのDNAは、A、C、G、Tなどの省略された一連のヌクレオチドで構成されています(例:「ACGAATTCCG」)。 DNAを研究しているとき、DNA内の反復配列を特定することが役立つ場合があります。

DNA分子に複数回出現する10文字の長さのシーケンス(サブストリング)をすべて見つけるには、1つのメソッドを作成する必要があります。

したがって、入力が「AAAAACCCCCAAAAACCCCCCAAAAAGGGTTT」の場合、出力は["AAAAACCCCC"、"CCCCCAAAAA"]になります。

これを解決するには、次の手順に従います-

  • 配列ret、n:=sのサイズを定義し、visitedとvisited2という2つのセットを作成します

  • bitValというマップを定義します。

  • 0123などのACGTに対応する値をbutValに保存します。

  • マスク:=0

  • 0からn–1の範囲のiの場合

    • マスク:=マスク* 4

    • マスク:=マストまたはbitVal [s [i]]

    • マスク:=マスクとFFFFF

    • i <9の場合は、次の反復に進みます

      • 部分文字列フォームインデックスi–9から9をretに挿入します

      • マークをvisited2に挿入します。

    • 訪問者にマスクを挿入

  • 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++で文字列の最初に存在する繰り返し文字を検索します

    文字列があるとします。繰り返される最初の文字を見つける必要があります。文字列は「HelloFriends」なので、最初に繰り返される文字はlになります。次々と2つのlがあるので。 これを解決するために、ハッシュ手法を使用します。ハッシュテーブルを1つ作成し、各文字を1つずつスキャンします。文字が存在しない場合はハッシュテーブルに挿入し、すでに存在する場合はその文字を返します。 例 #include<iostream> #include<unordered_set> using namespace std; char getFirstRepeatingChar(stri

  2. LinuxでのC++の最高のIDEは何ですか?

    大きなプロジェクトは、単なるテキストエディタでは管理が困難です。このような場合にIDEを使用すると、生産性が向上し、フラストレーションが軽減される可能性があります。 IDEにはさまざまな種類があり、ニーズに合ったものを選択する必要があります。 Linux上のC++に最適なIDEは1つではありません。ツールは賢く選ぶ必要があります。 Linux用の人気のあるIMOの最高のIDEのリストは次のとおりです。 C /C++開発用のNetbeans- Netbeansは、C /C++および他の多くのプログラミング言語向けの無料のオープンソースで人気のあるクロスプラットフォームIDEです。コミュニテ