java 蓝桥杯 人物相关性分析


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

/**
 * 题目描述
 * 小明正在分析一本小说中的人物相关性。他想知道在小说中 Alice 和 Bob 有多少次同时出现。
 *
 * 更准确的说,小明定义 Alice 和 Bob "同时出现" 的意思是:在小说文本 中 Alice 和 Bob 之间不超过 KK 个字符。
 *
 * 例如以下文本:
 *
 * This is a story about Alice and Bob.Alice wants to send a private message to Bob.
 *
 * 假设 KK = 20,则 Alice 和 Bob 同时出现了 2 次,分别是"Alice and Bob" 和 "Bob. Alice"。前者 Alice 和 Bob 之间有 5 个字符,后者有 2 个字符。
 *
 * 注意:
 *
 * Alice 和 Bob 是大小写敏感的,alice 或 bob 等并不计算在内。
 *
 * Alice 和 Bob 应为单独的单词,前后可以有标点符号和空格,但是不能 有字母。例如出现了 Bobbi 并不算出现了 Bob。
 *
 * 输入描述
 * 第一行包含一个整数 K(1 \leq K \leq 10^6)K(1≤K≤10
 * 6
 *  )。
 *
 * 第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超过 10^610
 * 6
 *  。
 *
 * 输出描述
 * 输出一个整数,表示 Alice 和 Bob 同时出现的次数。
 */
public class exercise_5 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int number = in.nextInt();
        in.nextLine();
        String str = in.nextLine();
        String[] words = {"Alice","Bob"};
        ArrayList<Long> arrA = new ArrayList<>();//存放Alice下标
        ArrayList<Long> arrB = new ArrayList<>();//存放Bob下标
        String str1 = "",str2 = "";
        //每次读取7字节循环一次首字节位置+1,并判断是否单独出现,如果符合条件则记录其下标
        for (int i = 0; (i+7) <= str.length(); i++) {
            str1 = str.substring(i,i+7);
            str2 =  str1.substring(1,6);
            if(judge(str1)&&str2.equals(words[0])){
                arrA.add((long) i);
                System.out.println(i);
            }

        }
        //每次读取5字节循环一次首字节位置+1,并判断是否单独出现,如果符合条件则记录其下标
        for (int i = 0; (i+5) <= str.length(); i++) {
            str1 = str.substring(i,i+5);
            str2 =  str1.substring(1,4);
            if(judge(str1)&&str2.equals(words[1])){
                arrB.add((long) i);
            }
        }
        int sum = 0;
        for (int i = 0; i < arrA.size(); i++) {
            long A = arrA.get(i);
            for (int j = 0; j < arrB.size(); j++) {
                long B = arrB.get(j);
                if(A>B && (A-B) <= number+3)
                    sum++;
                if(A<B && (B-A) <= number+5)
                    sum++;
            }
        }
        System.out.println(sum);
        in.close();
    }

    //判断字节头尾是否为字母,是则返回false,反之返回true
    public static boolean judge(String s){
        int l = s.length()-1;
        //判断字符串第一位是否是大小写字母
        boolean  a = s.charAt(0)>=97 && s.charAt(0) <= 122 && s.charAt(0)>=65 && s.charAt(0)<=90;
        //判断字符最后一位是否是大小写字母
        boolean  b = s.charAt(l)>=97 && s.charAt(l) <= 122 && s.charAt(l)>=65 && s.charAt(l)<=90;
        if(a&&b){
            return false;
        }else{
            return true;
        }
    }
}

你可能感兴趣的:(java,蓝桥杯)