第十届蓝桥杯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);
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 官网 中文版本 好的网站 Content-type: text/htmlBASH Section: User ...
    不排版阅读 10,024评论 0 5
  • 写在前面的话 代码中的# > 表示的是输出结果 输入 使用input()函数 用法 注意input函数输出的均是字...
    FlyingLittlePG阅读 8,190评论 0 9
  • feisky云计算、虚拟化与Linux技术笔记posts - 1014, comments - 298, trac...
    不排版阅读 9,465评论 0 5
  • 美丑并不是由高矮胖瘦来决定,而是通过比例。几乎所有用眼睛看起来觉得美的东西,都合乎美的比例,即“黄金分割”。...
    金玉礼仪阅读 4,189评论 0 1
  • 也许你身性粗犷,不拘小节,做什么事都喜欢浅尝辄止,也许你一碰到困难就退缩,总在原地踏步的安于现状,那么在《如何把事...
    春来燕回阅读 1,819评论 0 5

友情链接更多精彩内容