DNA序列,双指针,O(n)时间复杂度
DNA序列
http://www.nowcoder.com/questionTerminal/e8480ed7501640709354db1cc4ffd42a
首先,大家得理解题意,子串长度是固定的,因此要使子串中GC-Ratio最大,只需子串中的GC数量达到最大即可,不需要去计算比例。
思路:使用双指针维护一个长度固定的子串,逐步向后遍历,类似于滑动窗口,每加入一个字符,更新子串GC的数量,并记录位置,遍历完毕整个序列即可得到最大GC比例的子串出现的位置。整个思路和双端队列的解题思路是类似的。
#include <stdio.h> int main(void) { char DNA_str[100000] = {0}; int len; int GC_cnt;//记录子串GC的数量 int max_GC_num;//记录子串GC的最大数量 int max_GC_pos;//记录子串中GC数量最大时,子串的位置,方便输出 int sub_str_len;//子串长度 int i, j; while((gets(DNA_str)) != NULL){ scanf("%d",&sub_str_len); len = strlen(DNA_str); GC_cnt = 0; for(i = 0; i < sub_str_len;i++){ if(DNA_str[i] == 'G' || DNA_str[i] == 'C'){ GC_cnt++; } } max_GC_num = GC_cnt; max_GC_pos = 0; i = 1; j = sub_str_len; for(; j < len;i++,j++){ if(DNA_str[i-1] == 'G' || DNA_str[i-1] == 'C'){ GC_cnt--; } if(DNA_str[j] == 'G' || DNA_str[j] == 'C'){ GC_cnt++; } if(max_GC_num < GC_cnt){ max_GC_num = GC_cnt; max_GC_pos = i; } } for(int i = max_GC_pos; i < max_GC_pos+sub_str_len;i++){ printf("%c",DNA_str[i]); } printf("\n"); memset(DNA_str,0,100000); } }