人物相关性分析
【问题描述】
小明正在分析一本小说中的人物相关性。他想知道在小说中 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 个字符。
注意:
1. Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。
2. 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.
试题H: 人物相关性分析 11第十届蓝桥杯大赛软件类省赛 Java 大学 C 组
【样例输出】
2
思路
利用String的split方法分割语句存放到数组中,再将分割后的单词长度存到另一个数组中,
开始for循环找Alice--Bob,找完后再找Bob--Alice
代码
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int k=sc.nextInt();
sc.nextLine();
String str=sc.nextLine();
//分割语句存放到words中
String[] words=str.split("\\s|\\.");
//System.out.println(Arrays.toString(words));
int[] wordslength=new int[words.length];
for (int i = 0; i < wordslength.length; i++) {
//将分割后每一个单词的长度存放到wordslength中
wordslength[i]=words[i].length();
}
int num=0;
//Alice---Bob
for (int i = 0; i < words.length; i++) {
//如果找到Alice
if(words[i].equals("Alice")){
for (int j = i+1; j < words.length; j++) {
//因为Alice后有一个空格而j从Alice后面一个单词开始所以sum=1
int sum=1;
if(words[j].equals("Bob")){
//将Alice和Bob之间的长度累加给sum
for (int l = i+1; l < j; l++) {
//每个长度+1是因为中间有空格或者.
sum+=wordslength[l]+1;
}
if(sum<=k){
num++;
}
}
}
}
}
//Bob---Alice
//将上面代码cv一下判断条件Alice和Bob调换一下
for (int i = 0; i < words.length; i++) {
if(words[i].equals("Bob")){
for (int j = i+1; j < words.length; j++) {
int sum=1;
if(words[j].equals("Alice")){
for (int l = i+1; l < j; l++) {
sum+=wordslength[l]+1;
}
if(sum<=k){
num++;
}
}
}
}
}
System.out.println(num);
}
}