思路
- 根据题意暴力破解
- 构造结构体存储子串对应的GC-Ratio、GC个数、出现的序号、子串注意:这里的结构体不是一次性想出来的,再程序调试过程中需要啥补啥
- 获取字符串和子串长度
- 查找子串,并将子串存储,子串是,从第0个向后数0+num
- 同时记录子串出现的次序,方便后续出现相同GC-Ratio时比较输出的顺序
- 统计每个子串的GC个数
- 计算GC-Ratio
- 将GC-Ratio从小到大排序
- 比较最大值和所有的值是否最大,如果有和最大值一样的值,输出最先出现的那个(次序最小那个)
- 必须得调试,一步一步走,不给调试本宝宝是做不出来 555555555555~
Answer
// 一个 DNA 序列由
// A/C/G/T 四个字母的排列组合组成。
// G 和 C 的比例(定义为 GC-Ratio )是序列中 G 和 C 两个字母的总的出现次数除以总的字母长度)。
// 给定一个很长的 DNA 序列,以及限定的子串长度 N ,
// 请帮助研究人员在给出的 DNA 序列中从左往右找出 GC-Ratio 最高且长度为 N 的第一个子串。
// DNA序列为 ACGT 的子串有: ACG , CG , CGT 等等,但是没有 AGT , CT 等等
#include<stdio.h>
#include<string.h>
struct {
float Ratio;//子串对应的GC-Ratio
int gc_cnt;//GC个数
int sn;//出现的序号
char str_child[1000];//子串
} data[1000], temp;
int main() {
char str[1000];
int num;
scanf("%s", str);
scanf("%d", &num);
int len = strlen(str);
int h = 0;
int k = 0;
for (int i = 0; i < len - num + 1; i++) {
k = 0;
//子串是,从第1个向后数1个,从第2个向后数1个,从第3个向后数1个
for (int j = i; j < i + num; j++) {
data[h].str_child[k++] = str[j]; //存子串
}
data[h].sn = h;
h++;//子串个数
}
//统计每个子串的GC个数
for (int i = 0; i < h; i++) {
//遍历子串,计算GC-Ratio
for (int j = 0; j < num; j++) {
if ((data[i].str_child[j] == 'G') || data[i].str_child[j] == 'C') {
data[i].gc_cnt += 1;
}
}
}
//计算GC-Ratio
for (int i = 0; i < h; i++) {
data[i].Ratio = (float)data[i].gc_cnt / num;
}
for (int i = 0; i < h; i++) {
for (int j = i + 1; j < h; j++) {
if (data[i].Ratio > data[j].Ratio) {
temp = data[i];
data[i] = data[j];
data[j] = temp;
}
}
}
//比较最大值和所有的值是否最大,如果有和最大值一样的值,输出最先出现的那个
int outNum = h - 1;
for (int i = 0; i < h; i++) {
if (data[outNum].Ratio == data[i].Ratio) {
//输出序号最小的那个
if (data[i].sn < data[outNum].sn) {
outNum = i;
}
}
}
printf("%s",data[outNum].str_child);
return 0 ;
}