題目要求找的是配對的DNA鏈的對數(shù)袱巨,何為配對?兩條鏈中A<->T,C<->G即為配對张弛,這容易判斷箫爷,解決該題的關(guān)鍵是去掉不適合題意要求的情況,比如:1.兩條鏈必須等長啊犬;2.不能重復(fù)配對,就是每一條鏈如果找到配對的鏈壁查,只能配對一次觉至,下面詳細(xì)解釋一下:
1.ATCG
2.TTTT
3.TAGC
4.TTTT
5.TAGC
6.TTTT
7.ATCG
我們做檢查配對循環(huán)時,發(fā)現(xiàn)鏈1和鏈3是配對的睡腿,這時鏈1和鏈3都是已配對過的语御,故不能再說鏈1和鏈5配對,鏈3和鏈7配對了席怪。解決辦法是一旦找到與鏈1配對的鏈应闯,就計數(shù)一次,跳出循環(huán)挂捻,不再往下找與鏈1配對的其他鏈碉纺,進(jìn)而開始找與鏈2配對的鏈,而與鏈1配對過的鏈3為了避免其再與其他鏈配對,可以刻意把它弄“臟”骨田,我代碼中是直接給它賦值“-1”耿导,源碼如下:
#include<iostream>
#include<string>
using namespace std;
bool isMatch(string s1,string s2)
{
int count=0;
if(s1.length()!=s2.length())
return false;
else
{
for(int i=0;i<s1.length();i++)
{
if((s1[i]=='A'&&s2[i]=='T')||(s1[i]=='T'&&s2[i]=='A')||(s1[i]=='C'&&s2[i]=='G')||(s1[i]=='G'&&s2[i]=='C'))
count++;
else
break;
}
}
if(count==s1.length())
return true;
else
return false;
}
int main()
{
int T,n,matchNum=0;
int testNum[20]={0};
string strArray[100];
cin>>T;
for(int tn=0;tn<T;tn++)
{
cin>>n;
for(int i=0;i<n;i++)
cin>>strArray[i];
for(int j=0;j<n-1;j++)
for(int k=j+1;k<n;k++)
{
if(isMatch(strArray[j],strArray[k]))
{
strArray[k]="-1";
testNum[tn]++;
break;
}
}
}
for(int te=0;te<T;te++)
{
cout<<testNum[te]<<endl;
}
return 0;
}