本题目要求读入两个两个DNA序列A和B,其中A为人的DNA序列,B为病毒的DNA序列,然后判断A中是否出现病毒B(注:病毒的DNA序列为环状)。
输入一个整数n,然后输入n对DNA序列(每一DNA序列为一字符串,长度不超过10000)。
针对每一对DNA序列A和B,若B在A中出现,则输出Yes,否则输出No
2
AAAAAAAAACCCCGGGGTTTTTTTAGTCCCTTGGGAAATCGAAGTC 、GTCAAAAAAAAA
GGGGTTTTTCCCCCCAAAATTTCCCGGGTTTTTT 、TTTTGGGGTTT
Yes
Yes
IsVinDNA 函数:检查病毒DNA序列是否出现在人的DNA序列中的函数。它接受两个字符串参数 a 和 b,其中 a 代表人的DNA序列,而 b 代表病毒DNA序列。首先,函数获取字符串 a 和 b 的长度并存储在 lena 和 lenb ,以便后续比较。
然后,检查病毒DNA序列 b 的长度是否大于人的DNA序列 a 的长度,如果是,直接返回 false(病毒DNA序列无法包含在人的DNA序列中)
接下来,创建一个字符串 cir(circle,环),将人的DNA序列 a 连接自身,实际上是构造了一个环状的DNA序列。
最后,用 find 函数查找病毒DNA序列 b 是否在环状DNA序列 cir 中出现
IsVinDNA 函数来检查病毒DNA序列是否出现在人的DNA序列中。最后根据检查结果,输出 “Yes” 或 “No”。这段代码的思路是将人的DNA序列连接自身,构造成一个环状的DNA序列,然后检查病毒DNA序列是否在这个环状序列中出现
注意事项:
使用的字符串的 find 函数来检查是否包含子串(C语言可以用strstr,效果差不多)
#include
#include
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;
}