题目描述
程序猿圈子里正在流行一种很新的简写方法:对于一个字符串,只保留首尾字符,将首尾字符之间的所有字符用这部分的长度代替。例如 internation-alization 简写成 i18n,Kubernetes (注意连字符不是字符串的一部分)简写成 K8s, Lanqiao 简写成 L5o 等。
在本题中,我们规定长度大于等于 K 的字符串都可以采用这种简写方法(长度小于 K 的字符串不配使用这种简写)。
给定一个字符串 S 和两个字符 c1 和 c2,请你计算 S 有多少个以 c1 开头c2 结尾的子串可以采用这种简写?
输入格式
第一行包含一个整数 K。
第二行包含一个字符串 S 和两个字符 c1 和 c2。
输出格式
一个整数代表答案。
样例输入
4 abababdb a b
样例输出
6
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int k = sc.nextInt();
String s = sc.next();
int[] f = new int[s.length() + 1];//f[i]表示从索引i开始有几个字符b
char a = sc.next().charAt(0);
char b = sc.next().charAt(0);
int len = s.length();
long num = 0;
for (int i = len - 1; i >= 0; i--) {
f[i] = f[i + 1];
if (s.charAt(i) == b) {
f[i]++;
}
}
for (int i = 0; i + k - 1 < len; i++) {
if (s.charAt(i) == a) {
num += f[i + k - 1];
}
}
System.out.println(num);
}
}