题解:蓝桥云课 3419 小郑的蓝桥平衡串

【题目来源】

蓝桥云课:1.小郑的蓝桥平衡串 - 蓝桥云课 (lanqiao.cn)

【题目描述】

平衡串指的是一个字符串,其中包含两种不同字符,并且这两种字符的数量相等。

例如, ababab和aababb都是平衡串, 因为每种字符各有三个, 而abaab和aaaab都不是平衡串,因为它们的字符数量不相等。

平衡串在密码学和计算机科学中具有重要应用,比如可以用于构造哈希函数或者解决一些数学问题。

小郑拿到一个只包含L、Q的字符串,他的任务就是找到最长平衡串,且满足平衡串的要求,即保证子串中L、Q的数量相等。

【输入】

输入一行字符串,保证字符串中只包含字符L、Q.

【输出】

输出一个整数,为输入字符串中最长平衡串的长度。

【输入样例】

LQLL

【输出样例】

2

【算法标签】

《蓝桥云课 3419 小郑的蓝桥平衡串》 #字符串# #前缀和#

【代码详解】

from itertools import accumulate

MOD = 1000000007  # 定义模数

def get_presum(a):
    """计算数组a的前缀和并取模
    
    参数:
        a: 输入数组
    
    返回:
        前缀和数组,每个元素对MOD取模
    """
    sum = list(accumulate(a))  # 使用itertools.accumulate计算前缀和
    sum = [x % MOD for x in sum]  # 对每个前缀和取模
    return sum

def get_sum(sum, l, r):
    """快速计算区间和[l,r]
    
    参数:
        sum: 前缀和数组
        l: 区间左端点
        r: 区间右端点
    
    返回:
        区间和,结果对MOD取模
    """
    if l == 0:
        return sum[r]  # 如果从0开始,直接返回sum[r]
    else:
        # 否则返回sum[r] - sum[l-1],并处理负数情况
        return (sum[r] - sum[l-1] + MOD) % MOD

S = input()  # 输入字符串
n = len(S)   # 字符串长度
a = []       # 数值化后的数组

# 将字符串转换为数值数组
for x in S:
    if x == 'L':
        a.append(1)   # 'L'对应1
    else:
        a.append(-1)  # 'R'对应-1

sum = get_presum(a)  # 计算前缀和
ans = 0              # 初始化最长平衡子串长度

# 双重循环检查所有可能的子串
for l in range(n):          # 左端点
    for r in range(l, n):   # 右端点
        # 如果区间和为0,说明L和R数量相等
        if get_sum(sum, l, r) == 0:
            # 更新最大长度
            ans = max(ans, r - l + 1)

print(ans)  # 输出结果

【运行结果】

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