题解:蓝桥云课 198 人物相关性分析

【题目来源】

蓝桥云课:1.人物相关性分析 - 蓝桥云课 (lanqiao.cn)

【题目描述】

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

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

【输入】

第一行包含一个整数 \(K(1<K<10^6)\).

第二行包含一行字符串,只包含大小写字母、标点符号和空格。长度不超过 \(10^6\)

【输出】

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

【输入样例】

20
This is a story about Alice and Bob. Alice wants to send a private
message to Bob.

【输出样例】

2

【算法标签】

《蓝桥 198 任务相关分析》 #2019# #字符串# #模拟# #省赛#

【解题思路】

image

【代码详解】

import bisect  
k = int(input())  # 输入k
s = input()  # 输入字符串
ls = list(s)  # 转换成列表,用于排除包含字符内容
ali = []  # 定义Alice和Bob列表,存放下标值
bob = []
ans = 0
st = 0
while True:
    idx = s.find('Alice', st)  # 获得下标
    if idx!=-1 and not ls[idx+5].isalpha():  # 如果找的到,且后面不是字符
        ali.append(idx)  # 添加到ali列表中
        st = idx+1  # 继续查找
    else:  # 否则退出循环
        break
st = 0
while True:
    idx = s.find('Bob', st)  # 同上,添加到bob列表中
    if idx!=-1 and not ls[idx+3].isalpha():
        bob.append(idx)
        st = idx+1
    else:
        break
for x in ali:  # 使用系统库函数bisect,在bob列表中查找Alice的下标
    l = bisect.bisect_right(bob, x-k-3)  # 返回第一个大于x-k-3的数的下标(bisect_right同C++ upper_bound)
    r = bisect.bisect_right(bob, x+k+5)  # 返回第一个大于x+k+5的数的下标
    ans += r - l  # 相减得到中间的个数
print(ans)

【运行结果】

2
posted @ 2026-03-04 10:47  团爸讲算法  阅读(1)  评论(0)    收藏  举报