题解 | #DNA序列#

DNA序列

http://www.nowcoder.com/practice/e8480ed7501640709354db1cc4ffd42a

使用滑动窗口的思路解决此题
1. 先计算出初始窗口中GC的个数;
2.向右滑动窗口,若左边弹出的字符为GC,则GC个数减1;相同,右边划入的若为GC,则GC个数加1;
3.若当前的GC个数大于之前的最大GC个数,记录左边窗口的index;
4.遍历完字符串后,就可以得出结果

#include <stdio.h>
#include <string.h>

#define MAX_STR_LEN 1000

int main(void)
{
    char str[MAX_STR_LEN + 1] = {0};
    int strLen;
    int winLen;
    int cntGC;
    int winLeft;
    int winRight;
    int i;
    int max = 0;
    int index = 0;
    
    scanf("%s%d", str,&winLen);
    strLen = strlen(str);
    cntGC = 0;
    winLeft = 0;
    winRight = winLen - 1;
    /* 先计算出初始窗口的GC个数 */
    for (i = 0; i < winLen; i++) {
        if (str[i] == 'G' || str[i] == 'C') {
            cntGC++;
        }    
    }
    /* 保存初始的GC max数 */
    max = cntGC;
    /* 滑动窗口 */
    for (i = 0; i < strLen - winLen; i++) {
        winRight++;
        /* 划入右边窗口判断 */
        if (str[winRight] == 'G' || str[winRight] == 'C') {
            cntGC++;
        }
        /* 弹出左边窗口判断 */
        if (str[winLeft] == 'G' || str[winLeft] == 'C') {
            cntGC--; 
        }
        winLeft++;
        /* 判断最大GC,并记录index */
        if (max < cntGC) {
            max = cntGC;
            index = winLeft;
        }
    }
    printf("%.*s\n", winLen, &str[index]);
    return 0;
}



全部评论

相关推荐

评论
2
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务