目标:找到长度为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));
}
}
}