人物相关性分析

题目描述

小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。

更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。

例如以下文本:
20 This is a story about Alice and Bob.Alice wants
to send aprivate 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 aprivate message to Bob.

【样例输出】

2

package Demo03_23;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;

public class Demo_01 {
	static char[] cha;
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		//接收k
		int k = sc.nextInt();
		//接受字符串
		String string = sc.nextLine();
		//将字符串转化为字符数组方便遍历
		cha = string.toCharArray();
		//存储名字的起始位置
		ArrayList<Integer> temp = new ArrayList<Integer>();
		ArrayList<Integer> list = new ArrayList<Integer>();
		//计数
		int count = 0;
		int[][] store;//先声明
		//
		for (int i = 0; i < cha.length; i++) {
			if (cha[i] == ' ' || cha[i] == ',' || cha[i] == '.') {
				list.add(i);
			}
		}
//		System.out.println(list);
		//有问题
		//检测第一个位置是否满足要求
		for (int i = 0; i < list.size(); i++) {
			if (i == 0 && (list.get(i) == 3 || list.get(i) == 5)) {
				if (check(list.get(i), string) != 0) {
					temp.add(0);
					temp.add(check(list.get(i), string));
				}
			}else if(i >= 1) {
				//检测第一个位置以后是否满足要求
				if (list.get(i) - list.get(i-1)-1 == 3 || list.get(i) - list.get(i-1)-1 == 5) {
//					System.out.println(list.get(i));
					if (check(list.get(i-1), list.get(i),string) != 0) {
						temp.add(list.get(i)-1);
						temp.add(check(list.get(i-1), list.get(i), string));
					}
				}
			}
			
		}
//		System.out.println(temp);
		store = new int[temp.size() / 2][2];
		
		//将临时存储中的值,转移到store中(一维转二维)
		for (int i = 0; i < store.length; i++) {
			store[i][0] = temp.get(2*i);
			store[i][1] = temp.get(2*i + 1);
//			System.out.println(Arrays.toString(store[i]));
		}
		
		
		//找相邻位置Alice和Bob的个数
		for (int i = 0; i < store.length - 1; i++) {
			for (int j = i+1; j < store.length; j++) {
				if (store[j][0] - store[i][0] <= k) {
					if ((store[i][1] == 1 && store[j][1] == 2) || store[i][1] == 2 && store[j][1] == 1) {
						count++;
					}
				}else {
					break;
				}
			}
		}
//		System.out.println(store.length);
		System.out.println(count);
		sc.close();
	}
//i为前一项,j为后一项
	private static int check(int i, int j, String string) {
		char[] aliceString = "Alice".toCharArray();
		char[] bobString = "Bob".toCharArray();
		if (j - i-1 == 3) {
			for (int m = 0, n = i+1; m < bobString.length;m++, n++) {
				if (bobString[m] != cha[n]) {
					return 0;
				}
			}
			return 1;
		}
		if (j - i-1 == 5) {
			for (int m = 0, n = i+1; m < bobString.length;m++, n++) {
				if (aliceString[m] != cha[n]) {
					return 0;
				}
				
			}
			return 2;
		}
		return 0;
		
	}
	//当位置是1时的重载方法
	private static int check(int j, String string) {
		char[] aliceString = "Alice".toCharArray();
		char[] bobString = "Bob".toCharArray();
		if (j == 3) {
			for (int i = 0; i < bobString.length; i++) {
				if (cha[i] != bobString[i]) {
					return 0;
				}
			}
			return 1;
		}
		if (j == 5) {
			for (int i = 0; i < aliceString.length; i++) {
				if (cha[i] != aliceString[i]) {
					return 0;
				}
			}
			return 2;
		}
		return 0;
	}

}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值