2021/3/30算法题打卡-人物相关性分析
人物相关性分析
题目
时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。
更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:
在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本: ThisisastoryaboutAliceandBob.AlicewantstosendaprivatemessagetoBob.
假设 K = 20,则 Alice 和 Bob 同时出现了 2 次,分别是”Alice and Bob” 和”Bob.
Alice”。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。
注意: 1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。
2. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。
例如 Bobbi 並不算出现了 Bob。
【输入格式】
第一行包含一个整数 K。 第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超 过 1000000。
【输出格式】 输出一个整数,表示 Alice 和 Bob 同时出现的次数。
【样例输入】 20 ThisisastoryaboutAliceandBob.AlicewantstosendaprivatemessagetoBob.
【样例输出】 2
【评测用例规模与约定】 对于所有评测用例,1≤ K ≤1000000。
分析
采用了spile分别按照Alice和Bob分割字符串
我们就可以得到每个Alice和Bob的下标
然后让他们相减得到距离
代码
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
/**
* @auther thk
* @date 2021/3/30 - 8:44
*/
public class T8人物相关性分析 {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int k = Integer.parseInt(bf.readLine());
String s = bf.readLine();
String[] alices = s.split("Alice");
String[] bobs = s.split("Bob");
ArrayList<Integer> aListIndex = new ArrayList<>();
ArrayList<Integer> bListIndex = new ArrayList<>();
int countA=alices.length-1;
int countB=bobs.length-1;
if(s.lastIndexOf("Alice")==s.length()-5)
countA++;
if(s.lastIndexOf("Bob")==s.length()-3)
countB++;
for(int i=0;i<countA;i++){
aListIndex.add(i==0?alices[i].length():alices[i].length()+aListIndex.get(i-1)+5);
}
for(int i=0;i<countB;i++){
bListIndex.add(i==0?bobs[i].length():bobs[i].length()+bListIndex.get(i-1)+3);
}
int count=0;
for(int aIndex:aListIndex){
for(int bIndex:bListIndex){
int length = 0;
if(aIndex<bIndex){
length = bIndex-aIndex-5;
}else{
length = aIndex-bIndex-3;
}
if(length<k)
count++;
}
}
System.out.println(count);
}
}

浙公网安备 33010602011771号