【蓝桥杯】人物相关性分析(java)

人物相关性分析

【问题描述】

小明正在分析一本小说中的人物相关性。他想知道在小说中 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);
	}

}

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值