题目描述
小明正在分析一本小说中的人物相关性。他想知道在小说中 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。 第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超
过 1000000。
(对于所有评测用例,1≤ K ≤1000000。)
输出
输出一个整数,表示 Alice 和 Bob 同时出现的次数
样例输入
20
This is a story about Alice and Bob. Alice wants to send a private message to Bob.
样例输出
2
题目分析
首先扫描一遍给定的字符串,将Alice和Bob记录下来,直接使用Stingbuffer的index方法,找到一个位置之后再判断当前这个位置是否符合要求,也就是这个姓名的前后是否不是字母,这里使用Character的isLetter方法判断,相对于自己写会好点,中间是字符参数,记得不要写成是数字。
将每一个符合的位置记录下来,形成两个数组,分别数alice数组和bob数组,alice数组用于记录alice每次出现的位置,bob记录bob出现的位置。
之后使用类似于***尺取法***的算法,将alice遍历一遍,使用两个指针,left指针和right指针,每一次都去找是否bob区间的位置是否小于要求的区间。小于的时候就让right++,当不在的时候就跳出bob的循环,当前left与right的差值就是中间满足条件的同时出现的次数。
package review;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;
import java.io.InputStreamReader;;
public class 人物相关性分析 {
public static void main(String[] args) throws IOException {
Scanner input = new Scanner(System.in);
BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
int size = Integer.parseInt(bf.readLine());
StringBuffer string = new StringBuffer(" "+bf.readLine()+" ");
String alice = "Alice";
String bob = "Bob";
String copyalice = "*****";
String copybob = "***";
ArrayList<Integer> aliceList = new ArrayList<>();
ArrayList<Integer> boblist = new ArrayList<>();
int x = string.indexOf(alice);
while(x != -1) {
if (!Character.isLetter(string.charAt(x-1)) && !Character.isLetter(string.charAt(x+5))) {
string.replace(x, x+5, copyalice);
aliceList.add(x-1);
x = string.indexOf(alice);
}else {
string.replace(x, x+5, copyalice);
x = string.indexOf(alice);
}
}
int y = string.indexOf(bob);
while(y != -1) {
if (!Character.isLetter(string.charAt(y-1)) && !Character.isLetter(string.charAt(y+3))) {
string.replace(y, y+3, copybob);
boblist.add(y-1);
y = string.indexOf(bob);
}else {
string.replace(y, y+3, copybob);
y = string.indexOf(bob);
}
}
int left = 0,right = 0;
int count = 0;
for(int a : aliceList) {
for(int b : boblist) {
if (Math.abs(a-(b+3)) <= size) {
right++;
}else {
count += (right-left);
left = right;
break;
}
}
}
System.out.println(count);
}
}