子串简写(JAVA)一维前缀和, 蓝桥杯
这个题用前缀和,开两个数组,一个存前n个字符数据的c1的数字个数,另一个前n个字符c2的数字个数,然后遍历一次加起来,有一个测试点没过去,把那个存最后数的换成long,应该是这题数据范围给的不对,按说不会超。
package com.js.datastructure.recursion.蓝桥;import java.util.Scanner;public class 子串简写_前缀和 {public static void main(String[] args) {Scanner scanner = new Scanner(System.in);int k = scanner.nextInt();String s = scanner.next();char c1 = scanner.next().charAt(0);char c2 = scanner.next().charAt(0);int l = s.length();int[] num1 = new int[l+1];int[] num2 = new int[l+1];for (int i = 0; i < l; i++) {if(s.charAt(i) == c1){num1[i+1] = num1[i] + 1;}else {num1[i+1] = num1[i];}if(s.charAt(i) == c2){num2[i+1] = num2[i] + 1;}else{num2[i+1] = num2[i];}}long num = 0;for (int j = 1; j < l-k+2; j++) {if(num1[j] > num1[j-1]){num = num + num2[l] - num2[j+k-2];}}System.out.println(num);}
}