题目描述
小明正在分析一本小说中的人物相关性。他想知道在小说中 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。
输入描述

输出描述
输出一个整数,表示 Alice 和 Bob 同时出现的次数。
输入输出样例
示例
输入
20
This is a story about Alice and Bob.Alice wants to send a private
message to Bob.
输出
2
运行限制
最大运行时间:1s
最大运行内存: 512M
总通过次数: 377 | 总提交次数: 726 | 通过率: 51.9%
难度: 中等 标签: 字符串, 模拟, 2019, 省赛
源码:
import java.util.Scanner;
import java.util.Vector;
public class 人物相关性分析 {
static String string;
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int k=scanner.nextInt();
scanner.nextLine();//注意这里 吸收多余的回车符
string=scanner.nextLine();
//存储Alice 和 Bob出现的位置
Vector<Integer> vectora=new Vector<Integer>();
Vector<Integer> vectorb=new Vector<Integer>();
for (int i = 0; i < string.length(); i++) {
if (i+5<=string.length() && string.substring(i,i+5).equals("Alice") && check(5,i)) {
vectora.add(i);
}
if (i+3<=string.length() && string.substring(i,i+3).equals("Bob") && check(3,i)) {
vectorb.add(i);
}
}
int l = 0,r = 0;
long ans = 0;
for (int i = 0; i < vectora.size(); i++) {
int index=vectora.get(i);
while(l<vectorb.size() && vectorb.get(l)<index-k-3) l++;
while(r<vectorb.size() && vectorb.get(r)<=index+k+5) r++;
ans+=r-l;
}
System.out.println(ans);
}
private static boolean check(int k, int i) {
if (i+k<string.length()) {
//大写字母
if (string.charAt(i+k)>='A' && string.charAt(i+k)<='Z') {
return false;
}
//小写字母
if (string.charAt(i+k)>='a' && string.charAt(i+k)<='z') {
return false;
}
}
if (i-1>=0) {
if (string.charAt(i-1)>='A' && string.charAt(i-1)<='Z') {
return false;
}
if (string.charAt(i-1)>='a' && string.charAt(i-1)<='z') {
return false;
}
}
return true;
}
}