转载自http://blog.youkuaiyun.com/u013220338/article/details/44536647
DNA序列由A C G T四个元素构成,如ACGCGTA。所谓逆序是指类似上面:GC GA CA这样的片段。一段DNA序列的逆序度是指序列中逆序的个数。
题目要求:现给定一DNA序列,求出该序列的逆序度,要求时间复杂度为O(N) ,N为序列长度。
分析:最简单的方法无非就是对每一个元素进行遍历,但这样的话时间复杂度是O(N^2),是不符合要求的。
所以必须从其他角度考虑,可以发现。对于某个元素,只需要关注有多少个和它为逆序的元素出现在它之前就行。如在index为6(index从0开始)的地方为元素C,我们只需要关注在6之前G,T出现了多少次就行。
这样的话只需要遍历一次,该序列的逆序度就求出来了。时间复杂度正好为O(N)
我的解法如下:
#include <cstdio>
int search_number(const char *padna){
//C作为A C G T的计数器
int c[4]={0,0,0,0},num=0;
for(int i=0;padna[i]!='\0';i++){
switch(padna[i]){
case 'A':
c[0]++;
num+=c[1]+c[2]+c[3];
break;
case 'C':
c[1]++;
num+=c[2]+c[3];
break;
case 'G':
c[2]++;
num+=c[3];
break;
case 'T':
c[3]++;
break;
default:
break;
}
}
return num;
}
int main(void){
const char *padna="TGCA";
int number=search_number(padna);
printf("%d\n",number);
return 0;
}