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

题目描述

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

  1. Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。例如出现了 Bobbi 并不算出现了 Bob。

输入描述

输出描述

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

输入输出样例

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

运行限制

  • 最大运行时间:1s

  • 最大运行内存: 512M

总通过次数: 377 | 总提交次数: 726 | 通过率: 51.9%

难度: 中等 标签: 字符串, 模拟, 2019, 省赛

源码:

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


public class 人物相关性分析 {

    static String string;
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int k=scanner.nextInt();
        scanner.nextLine();//注意这里 吸收多余的回车符
        string=scanner.nextLine();
        
        //存储Alice 和 Bob出现的位置
        Vector<Integer> vectora=new Vector<Integer>();
        Vector<Integer> vectorb=new Vector<Integer>();
        
        for (int i = 0; i < string.length(); i++) {
            if (i+5<=string.length() && string.substring(i,i+5).equals("Alice") && check(5,i)) {
                vectora.add(i);
            }
            if (i+3<=string.length() && string.substring(i,i+3).equals("Bob") && check(3,i)) {
                vectorb.add(i);
            }
        }
        int l = 0,r = 0;
        long ans = 0;
        for (int i = 0; i < vectora.size(); i++) {
            int index=vectora.get(i);
            while(l<vectorb.size() && vectorb.get(l)<index-k-3) l++;
            while(r<vectorb.size() && vectorb.get(r)<=index+k+5) r++;
            ans+=r-l;
        }
        System.out.println(ans);
    }
    private static boolean check(int k, int i) {
        if (i+k<string.length()) {
            //大写字母
            if (string.charAt(i+k)>='A' && string.charAt(i+k)<='Z') {
                return false;
            }
            //小写字母
            if (string.charAt(i+k)>='a' && string.charAt(i+k)<='z') {
                return false;
            }
        }
        if (i-1>=0) {
            if (string.charAt(i-1)>='A' && string.charAt(i-1)<='Z') {
                return false;
            }
            if (string.charAt(i-1)>='a' && string.charAt(i-1)<='z') {
                return false;
            }
        }
        return true;
    }

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

月亮被咬碎成星星

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

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

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

打赏作者

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

抵扣说明:

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

余额充值