题解:蓝桥云课 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# #字符串# #模拟# #省赛#
【解题思路】

【代码详解】
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
浙公网安备 33010602011771号