人物相关性分析-(蓝桥杯)

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

(对于所有评测用例,1≤ K ≤1000000。)

输出
输出一个整数,表示 Alice 和 Bob 同时出现的次数

样例输入
20
This is a story about Alice and Bob. Alice wants to send a private message to Bob.
样例输出
2

题目分析
首先扫描一遍给定的字符串,将Alice和Bob记录下来,直接使用Stingbuffer的index方法,找到一个位置之后再判断当前这个位置是否符合要求,也就是这个姓名的前后是否不是字母,这里使用Character的isLetter方法判断,相对于自己写会好点,中间是字符参数,记得不要写成是数字。
将每一个符合的位置记录下来,形成两个数组,分别数alice数组和bob数组,alice数组用于记录alice每次出现的位置,bob记录bob出现的位置。
之后使用类似于***尺取法***的算法,将alice遍历一遍,使用两个指针,left指针和right指针,每一次都去找是否bob区间的位置是否小于要求的区间。小于的时候就让right++,当不在的时候就跳出bob的循环,当前left与right的差值就是中间满足条件的同时出现的次数。

package review;

import java.io.BufferedReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Scanner;

import java.io.InputStreamReader;;


public class 人物相关性分析 {
	public static void main(String[] args) throws IOException {
		Scanner input = new Scanner(System.in);
		BufferedReader bf=new BufferedReader(new InputStreamReader(System.in));
		int size = Integer.parseInt(bf.readLine());
		StringBuffer string = new StringBuffer(" "+bf.readLine()+" ");
		String alice = "Alice";
		String bob = "Bob";
		String copyalice = "*****";
		String copybob = "***";
		ArrayList<Integer> aliceList = new ArrayList<>();
		ArrayList<Integer> boblist = new ArrayList<>();
		int x = string.indexOf(alice);
		while(x != -1) {
			if (!Character.isLetter(string.charAt(x-1)) && !Character.isLetter(string.charAt(x+5))) {
				string.replace(x, x+5, copyalice);
				aliceList.add(x-1);
				x = string.indexOf(alice);
			}else {
				string.replace(x, x+5, copyalice);
				x = string.indexOf(alice);
			}
		}
		int y = string.indexOf(bob);
		while(y != -1) {
			if (!Character.isLetter(string.charAt(y-1)) && !Character.isLetter(string.charAt(y+3))) {
				string.replace(y, y+3, copybob);
				boblist.add(y-1);
				y = string.indexOf(bob);
			}else {
				string.replace(y, y+3, copybob);
				y = string.indexOf(bob);
			}
		}
		int left = 0,right = 0;
		int count = 0;
		for(int a : aliceList) {
			for(int b : boblist) {
				if (Math.abs(a-(b+3)) <= size) {
					right++;
				}else {
					count += (right-left);
					left = right;
					break;
				}
			}
		}

		System.out.println(count);
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WeChat098

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值