トピック
この質問では、2 つの DNA 配列 A と B を読み取る必要があります。ここで、A はヒトの DNA 配列、B はウイルスの DNA 配列です。次に、ウイルス B が A に現れるかどうかを判断する必要があります (注: ウイルスの DNA 配列は環状です)。
入力フォーマット
整数 n を入力し、n 組の DNA シーケンスを入力します (各 DNA シーケンスは文字列であり、長さは 10000 を超えません)。
出力フォーマット
DNA 配列 A と B の各ペアについて、B が A に出現する場合は Yes を出力し、それ以外の場合は No を出力します。
入力サンプル
2
AAAAAAAAACCCCGGGGTTTTTTTAGTCCCTTGGGAAATCGAAGTC
、GTCAAAAAAAAA
GGGGTTTTTCCCCCCAAAATTTCCCGGGTTTTTT
、TTTTGGGGTTT
出力サンプル
はい
はい
アイデア
IsVinDNA
機能: ウイルスの DNA 配列がヒトの DNA 配列に現れるかどうかをチェックする機能。 2 つの文字列パラメーター a と b を受け入れます。ここで、a はヒト DNA 配列を表し、b はウイルス DNA 配列を表します。
まず、この関数は文字列 a と b の長さを取得し、その後の比較のために lena と lenb に格納します。
次に、ウイルスの DNA 配列の長さ b がヒトの DNA 配列の長さ a より大きいかどうかを確認し、大きい場合は直接 false を返します(ウイルスの DNA 配列はヒトの DNA 配列に含まれません)。
次に、文字列 cir (円、リング) を作成し、ヒト DNA 配列 a をそれ自体に接続します。実際には、環状の DNA 配列が構築されます。
最後に、find 関数を使用して、ウイルス DNA 配列 b が環状 DNA 配列 cir に現れるかどうかを調べます。
- 主に、DNA 配列の各ペアはループを通じて処理されます。各サイクルで、それぞれヒト DNA 配列とウイルス DNA 配列を表す 2 つの文字列 s1 と s2 が読み取られます。次に、
IsVinDNA
関数を呼び出して、ウイルス DNA 配列がヒト DNA 配列に出現するかどうかを確認します。最後に、チェック結果に応じて「Yes」または「No」が出力されます。
このコードの考え方は、人間の DNA 配列をそれ自体に接続し、 環状の DNA 配列を構築し、それからチェックすることです。ウイルス DNA 配列がこの環状配列内に存在するかどうか
予防:
文字列の find 関数を使用して、部分文字列が含まれているかどうかを確認します (strstr は C 言語で使用でき、効果は似ています)。
コード
#include<iostream>
#include<string>
using namespace std;
bool IsVinDNA(const string&a,const string&b)
{
int lena = a.length();
int lenb = b.length();
if(lenb > lena)
return false;
string cir = a+a;
if(cir.find(b) != string::npos)
return true;
return false;
}
int main()
{
int n;
cin>>n;
string s1,s2;
for(int i =0 ;i<n;i++)
{
cin>>s1>>s2;
if(IsVinDNA(s1,s2))
{
cout<<"Yes"<<endl;
}
else
{
cout<<"No"<<endl;
}
}
return 0;
}