这道来自上海计算机学会2026年2月赛丙组的编程题,表面看是个数学展开式问题,实则考察选手对递归算法和动态规划思想的掌握程度。题目给出一个形如"a(b,c(d,e))"的奇怪展开式,要求按照特定规则展开后输出结果。
这类题型在编程竞赛中属于中等难度,主要检验三个能力:
输入仅一行字符串S(1≤|S|≤1000),由小写字母、逗号和括号组成。例如:
code复制a(b,c(d,e))
展开后的字符串,规则为:
示例输入输出:
code复制输入:a(b,c(d,e))
输出:abacadae
最直观的方法是递归处理:
python复制def expand(s):
res = []
i = 0
while i < len(s):
if s[i] == '(':
j = find_matching(s, i)
inner = expand(s[i+1:j])
res.append(inner)
i = j + 1
elif s[i] == ',':
i += 1
else:
res.append(s[i])
i += 1
return ''.join(res)
对于大规模数据,可以采用记忆化搜索:
python复制from functools import lru_cache
@lru_cache(maxsize=None)
def expand(s):
# 实现同上
python复制def find_matching(s, start):
balance = 0
for i in range(start, len(s)):
if s[i] == '(':
balance += 1
elif s[i] == ')':
balance -= 1
if balance == 0:
return i
return -1
遇到逗号时需要保留前驱字符:
python复制if s[i] == ',':
res.append(res[-1]) # 重复前一个字符
i += 1
python复制test_cases = [
("a", "a"),
("a(b,c)", "abac"),
("a(b,c(d,e))", "abacadae"),
("a(b(c,d),e)", "abcabdae")
]
这道题的精妙之处在于用简单的语法规则,考察了字符串处理、递归思想、优化意识等多个编程核心能力。在实际比赛中,建议先用15分钟确保基础解法正确,再视时间决定是否优化。