[算法题]DNA序列

题目链接: DNA序列

题目要求在给出的字符串中找出含有最多 'G' 或 'C' 长度为 N 的子串, 用滑动窗口求解即可, 题目中输入的 N 即为窗口大小, 定义两个变量 begin, end 遍历字符串, 当窗口大小小于 N 时, 通过移动 end 遍历字符串, 当窗口大小等于 N 时判断本次窗口中出现的 'G' 或 'C' 的次数是不是最大的, 是则更新数据, 当窗口大小大于 N 时, 移动 begin, 并更新窗口中的 'G' 或 'C' 的出现次数.

题解代码:

#include <iostream>
using namespace std;

int main() 
{
    string str;
    int n;
    cin >> str >> n;
    //窗口区间[begin,end]
    int begin = 0;
    int end = 0;
    int maxGC = 0; //存储GC比例最高的次数
    int maxGC_begin = 0;
    int tmp = 0;
    while(end < str.size())
    {
        if(str[end] == 'G' || str[end] == 'C')
        {
            tmp++;
        }
        //窗口大小大于n,需要缩小窗口
        if(end - begin == n)
        {
            if(str[begin] == 'G' || str[begin] == 'C')
            {
                tmp--;
            }
            begin++;
        }
        //窗口大小等于n,需要更新数据
        if(end - begin == n - 1)
        {
            if(tmp > maxGC)
            {
                maxGC = tmp;
                maxGC_begin = begin;
            }
        }
        end++;
    }
    cout << str.substr(maxGC_begin, n) << endl;
    return 0;
}

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值