import java.io.BufferedInputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
ArrayList<Integer> a=new ArrayList<>();//储存alice的位置
ArrayList<Integer> b=new ArrayList<>();//储存bob的位置
int k=scanner.nextInt();
scanner.nextLine();
String string=scanner.nextLine();
int alice=0;//alice的标志位
int bob=0;//bob的标志位
int c=0;
for(int j=0;j<string.length()-3;j++)
{
alice = 0;
bob = 0;
if(string.startsWith("Alice", j)||string.startsWith("Bob", j))//用if判断一下减少时间复杂度
{
for(int i=j;i<i+8+k;i++)//确定窗口的大小 在窗口内寻找
{
if(string.startsWith("Alice", i)&&i<=i+3+k)
{
a.add(i);//发现alice 并把alice存入列表
alice=1;//发现的标志
}
if(string.startsWith("Bob", i)&&i<=i+5+k)
{
b.add(i);//发现bob 并把bob存入列表
bob=1;//发现的标志
}
if(alice==1&&bob==1)//同时发现alice和bob
{
c++; //数量加一
alice=0;//重新置零
bob=0;//重新置零
j=i;//从当前位置开始继续搜索
break;//跳出当前循环
}
}
}
}
System.out.print(c);
}
}
人物相关性分析 2019年
【问题描述】 小明正在分析一本小说中的人物相关性。 他想知道在小说中 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 。
【输出格式】 输出一个整数, 表示 Alice 和 Bob 同时出现的次数。
【样例输入】 20 This is a story about Alice and Bob. Alice wants to send a private message to Bob.
【样例输出】 2
【评测用例规模与约定】 对于所有评测用例, 1 ≤ K ≤ 1000000 。
思路:窗口定位法 窗口大小为 8+k-搜索字符的长度
然后移动窗口即可 一开始窗口一个一个的移动 如果找到一个alice和bob同时存在的情况 就从找到的位置break当前循环 并在该位置之后继续寻找,避免重复查找
喜欢就点个赞 或者关注支持一下阿