试题 H: 人物相关性分析【第十届蓝桥杯 省赛 Java B组】

试题 H: 人物相关性分析

【问题描述】

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

【代码】

import java.util.Scanner;

public class Main {
	public static void main(String args[]) {
		// BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
		Main main = new Main();
		main.receiveData();
		System.out.println(main.solve());
	}
	
	int k;
	String txt;
	byte[] site; // 利用下标表示Alice和Bob在字符串中的位置
	
	void receiveData() {
		Scanner reader = new Scanner(System.in);
		k = reader.nextInt();
		reader.nextLine();
		txt = " "+reader.nextLine()+" "; // 去掉Alice和Bob位于字符串首或字符串尾时的特殊性
		site = new byte[txt.length()];
	}
	
	int solve() {
		char[] txtCh = txt.toCharArray(); // 判断查找到的Alice和Bob前后字符是否为非字母
		int k = -1;
		while ((k = txt.indexOf("Alice",k + 1)) != -1) {
			// 若Alice前后字符非字母,则在site中记录其位置
			if (!('A' <= txtCh[k-1] && txtCh[k-1] <= 'Z' && 'a' <= txtCh[k-1] && txtCh[k-1] <= 'z')
					&& !('A' <= txtCh[k+1] && txtCh[k+1] <= 'Z' && 'a' <= txtCh[k+1] && txtCh[k+1] <= 'z')) {
				site[k] = 1;
			}
		}
		k = -1;
		while ((k = txt.indexOf("Bob",k + 1)) != -1) {
			// 若Bob前后字符非字母,则在site中记录其位置
			if (!('A' <= txtCh[k-1] && txtCh[k-1] <= 'Z' && 'a' <= txtCh[k-1] && txtCh[k-1] <= 'z')
					&& !('A' <= txtCh[k+1] && txtCh[k+1] <= 'Z' && 'a' <= txtCh[k+1] && txtCh[k+1] <= 'z')) {
				site[k] = 2;
			}
		}
		
		int ans = 0;
		// 查找Alice位置前后是否有Bob,有则+1
		for (int i = 0; i < site.length; i++) if (site[i] == 1)  {
			int l = i - this.k - 3 > 0 ? i - this.k - 3 : 0; // 最小为0
			int r = i + this.k + 5 < site.length ? i + this.k + 5 : site.length; // 最大为site.length
			for (int j = l; j <= r; j++) {
				if (site[j] == 2) ans++;
			}
		}
		
		return ans;
	}
}
第十届蓝桥杯人物相关性题目是一道经典的编程问题,要求我们在给定的人物关系图中,判断两个人物之间是否存在一条关系链,即判断两个人物是否直接或间接地相关。 在这道题目中,我们可以使用图的搜索算法来解决问题。一种常见的算法是深度优先搜索(DFS),另一种是广度优先搜索(BFS)。 大概的思路是:首先,我们需要构建人物关系图,可以通过邻接矩阵、邻接表等数据结构来存储图的信息。然后,我们选择一个起始节点,从该节点开始进行搜索。如果在搜索的过程中找到了目标节点,即两个人物之间存在直接关系,那么我们可以结束搜索并返回结果。如果没有找到目标节点,则需要继续深入搜索,或者在广度搜索中扩展搜索队列。如果最终搜索完整个图都没有找到目标节点,那么可以判定两个人物之间不存在关系链。 具体实现时,可以使用递归或者栈来实现DFS,使用队列来实现BFS。在DFS中,我们可以利用函数的递归调用来实现深度搜索;在BFS中,我们可以通过队列不断地将待搜索节点加入队列,实现广度搜索。 总的来说,第十届蓝桥杯人物相关性题目考察了对图的数据结构和搜索算法的掌握程度。需要我们理解并实现图的构建和搜索过程,进而判断两个人物之间的相关性。这道题目不仅考察了编程基础知识,也锻炼了问题分析和解决能力,是一道非常有挑战性的编程题目。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值