第十届蓝桥杯C组—— 试题H: 人物相关性分析

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

题解:由“前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符”这句话可知,空格为一个字符而符号为两个字符,所以我们需要将空格和符号区分开。题目中Alice 和 Bob“同时出现”的次数我们可以转换为在每个Alice后k字符内出现Bob次数加上每个Bob后k字符出现Alice的次数。

public static void main(String[] args) {
    Scanner sc=new Scanner(System.in);
    int k=sc.nextInt();
    //换行问题.参考https://blog.csdn.net/zxfly6/article/details/80514903
    sc.nextLine();
    String str=sc.nextLine();
    //因为符号为两个字符所以把符号替换为任意两个字符以便于str通过split方法分割为数组
    str=str.replaceAll("\\.", " ab ");
    //以空格和.把句子分割成数组
    String [] strs=str.split("\\s+");
    //记录关联次数
    int count=0;
    //累加Alice后k字符Bob出现的次数
    for (int i = 0; i < strs.length; i++) {
        //用于记录间隔字符
        int chars=0;
        if (strs[i].equals("Alice")) {
            //检索此字符串后的单词
            for (int j = i+1; j < strs.length; j++) {               
                if (strs[j].equals("Bob")&&chars<=k) {
                    //记录
                    count++;
                }
                else {
                    chars=chars+(j-i)+1+strs[j].length();
                }
            }
        }
    }
    ////累加Bob后k字符Alice出现的次数
    for (int i = 0; i < strs.length; i++) {
        //用于记录间隔字符
        int chars=0;
        if (strs[i].equals("Bob")) {
            for (int j = i+1; j < strs.length; j++) {               
                if (strs[j].equals("Alice")&&chars<=k) {
                    count++;
                }
                else {
                    chars=chars+(j-i)+1+strs[j].length();
                }
            }
        }
    }
    System.out.println(count);
}

你可能感兴趣的:(第十届蓝桥杯C组—— 试题H: 人物相关性分析)