目标:找到长度为n的子串,并且g和c的个数最多 假设第一个子串subString(0,n)的g和c的总数是x个,不需要具体知道多少个 count是相对于是相对于第一个子串(0,n)g c的数量; max是相对于第一个子串(0,n) g c的最大数量 pos子串的起始位置,初始化为0 1、初始左右指针指向0,n-1; 2、如果下一个子串的count增加,count++,如果count>max,更新max和pos 如果下一个子串的count减少,count-- 3、滑动窗口,left++,right++ 4、输出subString(pos,pos+n)

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        while (in.hasNextLine()) { // 注意 while 处理多个 case
            String s = in.nextLine();//DNA序列
            int n = Integer.parseInt(in.nextLine());//子串的长度
            int max = 0;//max是相对于第一个子串(0,n) g c的最大数量,
            int count = 0;//count是相对于是相对于第一个子串(0,n)g c的数量
            int pos = 0;//pos子串的起始位置
            for(int left = 0,right = n-1;right<s.length();left++,right++){
                if(right + 1 <s.length()){//保证不越界
                    //g 和 c相对增多
                    if((s.charAt(right+1) == 'G' || s.charAt(right+1) == 'C') && 
                      (s.charAt(left) != 'G' && s.charAt(left) != 'C')){
                        count++;
                        if(count>max){
                            max = count;
                            pos = left + 1;
                        }
                    }
                    //g 和 c相对减少
                    if((s.charAt(right+1) != 'G' && s.charAt(right+1) != 'C') && 
                      (s.charAt(left) == 'G' || s.charAt(left) == 'C')){
                        count--;
                    }
                    ////g 和 c相对不变的情况不需要考虑,直接移动左右指针即可
                }
            }
            System.out.println(s.substring(pos,pos + n));
        }
    }
}