2021/3/30算法题打卡-人物相关性分析

人物相关性分析

题目

时间限制: 1.0s 内存限制: 512.0MB 本题总分:20 分
【问题描述】
小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。
更准确的说,小明定义 Alice 和 Bob“同时出现”的意思是:
在小说文本 中 Alice 和 Bob 之间不超过 K 个字符。
例如以下文本: ThisisastoryaboutAliceandBob.AlicewantstosendaprivatemessagetoBob.
假设 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 ThisisastoryaboutAliceandBob.AlicewantstosendaprivatemessagetoBob.
【样例输出】 2
【评测用例规模与约定】 对于所有评测用例,1≤ K ≤1000000。

分析

采用了spile分别按照Alice和Bob分割字符串
我们就可以得到每个Alice和Bob的下标
然后让他们相减得到距离

代码

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

/**
 * @auther thk
 * @date 2021/3/30 - 8:44
 */
public class T8人物相关性分析 {

    public static void main(String[] args) throws IOException {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
        int k = Integer.parseInt(bf.readLine());

        String s = bf.readLine();

        String[] alices = s.split("Alice");
        String[] bobs = s.split("Bob");

        ArrayList<Integer> aListIndex = new ArrayList<>();
        ArrayList<Integer> bListIndex = new ArrayList<>();


        int countA=alices.length-1;
        int countB=bobs.length-1;
        if(s.lastIndexOf("Alice")==s.length()-5)
            countA++;
        if(s.lastIndexOf("Bob")==s.length()-3)
            countB++;
        for(int i=0;i<countA;i++){
            aListIndex.add(i==0?alices[i].length():alices[i].length()+aListIndex.get(i-1)+5);
        }

        for(int i=0;i<countB;i++){
            bListIndex.add(i==0?bobs[i].length():bobs[i].length()+bListIndex.get(i-1)+3);
        }

        int count=0;

        for(int aIndex:aListIndex){
            for(int bIndex:bListIndex){
                int length = 0;
                if(aIndex<bIndex){
                    length = bIndex-aIndex-5;
                }else{
                    length = aIndex-bIndex-3;
                }
                if(length<k)
                    count++;
            }
        }
        System.out.println(count);
    }



}
posted @ 2021-03-30 10:01  唐坣  阅读(155)  评论(1)    收藏  举报