一、问题核心分析
1. 关键规则理解
- 项链是环形的,所以需要处理'首尾相连'的情况;
- 白色珠子
w 可以被当作任意颜色(红 r 或蓝 b);
- 打破项链后,从断点向左、右两个方向收集珠子:
- 从一端开始收集同色(含 w),直到遇到第一个不同的非 w 颜色;
- 另一端同理,且两端收集的颜色可以不同;
- 总数是两端收集的数量之和。
2. 解题核心思路
- 环形转线性:将字符串拼接成
s + s(如 brw→brwbrw),这样可以用线性遍历的方式处理环形的断点(比如断点在最后一个字符后,等价于处理拼接后字符串的对应位置);
- 遍历所有断点:对每个可能的断点(共
n 个),计算该断点能收集的最大珠子数;
- 计算单断点收集数:
- 确定断点左侧的'主颜色'(第一个非 w 颜色),向左收集所有该颜色 + w;
- 确定断点右侧的'主颜色'(第一个非 w 颜色),向右收集所有该颜色 + w;
- 两者之和为该断点的收集数(注意总数不能超过
n,避免重复计算);
- 取所有断点的最大值:即为答案。
二、完整代码(带详细注释)
def max_beads(n, s):
double_s = s + s
max_count = 0
for i in range(n):
right_color = None
right_count = 0
for j in range(i, i + n):
current = double_s[j]
if right_color is None:
if current != 'w':
right_color = current
right_count += 1
else:
right_count += 1
else:
current == right_color current == :
right_count +=
:
left_color =
left_count =
j (i - , i - - n, -):
current = double_s[j]
left_color :
current != :
left_color = current
left_count +=
:
left_count +=
:
current == left_color current == :
left_count +=
:
total = (right_count + left_count, n)
total > max_count:
max_count = total
max_count
n = (())
s = ().strip()
(max_beads(n, s))