蓝桥杯:人物相关性分析https://www.lanqiao.cn/problems/198/learning/
目录
题目描述
输入描述
输出描述
输入输出样例
输入
输出
输入
输出
运行限制
题目分析:(滑动窗口)
AC代码(JAVA)
题目描述
小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。
更准确的说,小明定义 Alice 和 Bob "同时出现" 的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本:
This is a story about Alice and Bob.Alice wants to send a private message to Bob.
假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是"Alice and Bob" 和 "Bob. Alice"。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。
注意:
-
Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。
-
Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。例如出现了 Bobbi 并不算出现了 Bob。
输入描述
第一行包含一个整数 K(1≤K≤)。
第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超过 。
输出描述
输出一个整数,表示 Alice 和 Bob 同时出现的次数。
输入输出样例
输入
20
This is a story about Alice and Bob.Alice wants to send a private message to Bob.
输出
2
输入
1000
Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Alice.Bob.Bob.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Alice.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Bob.Bob.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Bob.Alice.Bob.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Bob.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Bob.Alice.Alice.Alice.Alice.Bob.Bob.Bob.Bob.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Bob.Bob.Alice.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Bob.Alice.Alice.Bob.Alice.Alice.
输出
191784
运行限制
- 最大运行时间:1s
- 最大运行内存: 512M
题目分析:(滑动窗口)
我们需要记录下每个Alice和Bob出现的下标,记录Alice和Bob这两个单词首字母出现的下标,方便后续进行操作,不然每次搜索Alice的时候都需要进行equals判断,耗时非常高的。
遍历给定字符串str,我们分别记录下Alice和Bob出现的下标,分别存储到两个数组中,并且记录长度。
判断出现的下标的时候,首先判断头部是A还是B,如果是A,那么就需要判断末尾是否位e,则判断后面第四位是不是e。
B同理,同样需要判断末尾是不是b,也就是判断判断后面第二位是不是b。
如果是了,就在进行字符串截取和比较,与Alice or Bob相同则记录到数组中。
//处理字符串,存放到对应数组中
int len = str.length();
for (int i = 0; i < len; i++) {
//先判断头尾字符,相同的时候在比较相等
//Alice
if (i + 5 <= len && str.charAt(i) == 'A' && str.charAt(i + 4) == 'e') {
//比较相同
if (str.substring(i, i + 5).equals("Alice"))
Alice[AliceLength++] = i;
}
//Bob
if (i + 3 <= len && str.charAt(i) == 'B' && str.charAt(i + 2) == 'b') {
//比较相同
if (str.substring(i, i + 3).equals("Bob"))
Bob[BobLength++] = i;
}
}
如果使用双重for循环来遍历Alice和Bob数组的话,肯定会有超时的,但也能拿80%。
所以我们要考虑进行优化,优化遍历Alice的同时,找到满足不超过K个距离的Bob的出现下标。
如图所示,我们假设这个字符串,Alice的下标是20(A字母第一次出现的下标),K=5,那么,下标在12-30之间出现的Bob都算是合法的,也就是满足题目的“同时出现”.
至于为什么12也合法,因为Bob在Alice的左边,Bob在Alice的左边的话,是从b这个字符开始计算到A的字符个数,这个之间的间距。但是我们存放Bob出现的下标是存放B出现的下标的,所以需要在B出现下标的基础上+2.
因此我们在遍历每个Alice的时候,根据其出现的下标,锁定一个区域,在该区域内的Bob都算是合法的。因此我们可以使用双指针进行锁定。
如果我们将图1 的五个间隔符x换成Alice,将其看作第二锅个Alice,那么我们可以得到它的出现下标是25,然后确定它的范围,在 [17,35] 之间出现的Bob都是合法的。
所以,我们可以根据上图得出,第一个Alice的区间[12,30]是能够和第一个Alice满足“同时出现”的条件的。第二个Alice的区间[17,35]也满足“同时出现”的条件。
那么,第二个Alice的左区间,是不是在第一个Alice的基础上进行增加的,右区间也是同理。
因此,我们可以得出,对于任意一个Alice[i+1],它的左右区间一定是大于Alice[i]的。
因此,我们使用滑动窗口,来确定每一个Alice[i]的区间,在这个区间内的Bob,都视为合法的(也就是满足题目的“同时出现”)。
并且,对于对于每一个Alice[i+1],我们只需要移动窗口的位置即可,可以大大减少双重for循环遍历Alice的时候也需要重头到尾遍历的次数。可以用此来实现降低时间复杂度。
那么我们如何计算区间内的合法Bob数量呢?
这就可以用我们之前使用下标存放Bob的Bob数组了,Bob[i]代表第i个Bob出现的下标.
我们假设Alice[i]的下标是20,K=5,在上面我们可以知道,它的区间是[12,30],
也就是我们的区间指针left对应Bob出现的下标,必须小于这个区间,指针right对应Bob出现的下标,必须大于这个这个区间。
然后right-left,可以得到这个区间具体出现的Bob的数量,也就是对于这个Alice来说,合法的Bob数量。
真的是如此嘛?
我们假设left = 0,Bob[left] = 11,满足小于左区间。
right = 5,Bob[right] = 31,满足大于右边区间。
那么他们之间一共有几个元素呢? 1 2 3 4 ,一共有4个合法的Bob数量,但是如果直接用right-left的话,得到的应该是5,所以锁定左区间在0是不对的,我们可以让左区间继续累加。
也就是当Bob[left] 还是小于 左区间的时候,让left继续自增。直到不满足条件,也就是Bob[left] 不小于 左区间,这时候left代表的就算第一个合法的Bob,然后令right-left,即可满足条件,如 5-1 = 4,一共有4个合法的Bob区间。
因此本题可以使用滑动窗口来记录对于每一个Alice来说,合法的Bob数量,然后进行统计即可。
AC代码(Java)
import java.util.*;
// 1:无需package
// 2: 类名必须Main, 不可修改
public class Main {
static String str;
static int K;
static void init() {
Scanner scan = new Scanner(System.in);
K = Integer.parseInt(scan.nextLine());
str = scan.nextLine();
scan.close();
}
static int[] Alice = new int[1000000];
static int AliceLength = 0;
static int[] Bob = new int[1000000];
static int BobLength = 0;
public static void main(String[] args) {
init();
//处理字符串,存放到对应数组中
int len = str.length();
for (int i = 0; i < len; i++) {
//先判断头尾字符,相同的时候在比较相等
//Alice
if (i + 5 <= len && str.charAt(i) == 'A' && str.charAt(i + 4) == 'e') {
//比较相同
if (str.substring(i, i + 5).equals("Alice"))
Alice[AliceLength++] = i;
}
//Bob
if (i + 3 <= len && str.charAt(i) == 'B' && str.charAt(i + 2) == 'b') {
//比较相同
if (str.substring(i, i + 3).equals("Bob"))
Bob[BobLength++] = i;
}
}
//滑动窗口找答案
long ans = 0;
int left = 0;
int right = 0;
//遍历Alice,找Bob
for (int i = 0; i < AliceLength; i++) {
//收缩左边界,如果Bob[left] 小于 左边界,则继续收缩
while (left < BobLength && Bob[left] < Alice[i] - K - 3) {
left++;
}
//扩展右边界 如果Bob[right] 小于右边界,必须令其扩展,直到超出右边界
while (right < BobLength && Bob[right] < Alice[i] + K + 5) {
right++;
}
ans += Math.max((right - left), 0);
}
System.out.println(ans);
}
}