第十届蓝桥杯大赛软件类省赛Java大学B组 试题 H 人物相关性分析

试题 H: 人物相关性分析
时间限制: 1.0s 内存限制: 512.0MB 本题总分: 20 分
【问题描述】
小明正在分析一本小说中的人物相关性。他想知道在小说中 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.
【样例输出】
2
【评测用例规模与约定】
对于所有评测用例, 1 ≤ K ≤ 1000000。
 

这个问题感觉很复杂,其实就两步,

第一步找出所有Alice的位置和Bob的位置记录首字母就可以了

第二步找出所有Alice前面有多少符合的Bob,然后再找出来Bob前面有几个符合的Alice就可以了

思路并不难,当时做的时候觉得很难就放弃了,主要是一直在用C++

package lanqiao;

import java.util.Scanner;
import java.util.Vector;

public class ProblemH {
	static boolean jiancha(char C){
		if ((C>='a'&&C<='z')||(C>='A'&&C<='Z')) {
			return false;
		}
		return true;
	}
	public static void main(String[] args) {
		Vector<Integer> vectora = new Vector<Integer>();
		Vector<Integer> vectorb = new Vector<Integer>();
		int n;
		String string;
		Scanner scanner = new Scanner(System.in);
		n = scanner.nextInt();

		string = scanner.nextLine();
		string = scanner.nextLine();
		System.out.println(string);
		for (int i = 0; i+5 <= string.length(); i++) {
			if ((i==0 || jiancha(string.charAt(i-1)) == true) && (i+5==string.length() || jiancha(string.charAt(i+5)) == true)) {
		
				if (string.substring(i, i+5).equals("Alice")) {
					//System.out.println(i);
					vectora.add(i);
				}
			}
		}
		for (int i = 0; i+3 <= string.length(); i++) {
			if ((i==0 || jiancha(string.charAt(i-1)) == true) && (i+3==string.length() || jiancha(string.charAt(i+3)) == true)) {
				if (string.substring(i, i+3).equals("Bob")) {
					vectorb.add(i);
				}
			}
		}
		int ans = 0;
		for (int i = 0; i < vectora.size(); i++) {
			int l  =0,r=-1;
			while(r+1 < vectorb.size() && vectora.get(i) > vectorb.get(r+1)  ) {
				r++;
			}
			while (l<=r && vectora.get(i) >vectorb.get(l)+n+3  ) {
				l++;
			}
			ans += r-l+1;
		}
		
		for (int i = 0; i < vectorb.size(); i++) {
			int l  =0,r=-1;
			while(r+1 < vectora.size() && vectorb.get(i) > vectora.get(r+1)  ) {
				r++;
			}
			while (l<=r && vectorb.get(i) >vectora.get(l)+n+5  ) {
				l++;
			}
			ans += r-l+1;
		}
		System.out.println(ans);
	
	}
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值