1. 题目背景与核心需求解析
这道来自上海计算机学会2026年2月赛丙组的编程题,考察的是对特殊数字展开式的理解与实现能力。题目给出一个形如"3[2[1A]B]"的字符串,要求按照特定规则展开为完整字符串。这类题型在算法竞赛中属于中等难度的字符串处理问题,需要选手熟练掌握递归、栈操作等基础算法思想。
1.1 题目规则详解
展开式的核心规则可以归纳为:
- 字母字符直接保留
- 遇到
数字[内容]的结构时,将方括号内的内容重复数字指定的次数 - 嵌套结构需要从内向外逐层展开
以样例"3[2[1A]B]"为例:
- 最内层
1A展开为A - 中层
2[A]展开为AA - 外层
3[AAB]最终展开为AABAABAAB
1.2 解题思路分析
这类字符串展开问题通常有两种主流解法:
- 递归法:遇到数字时递归处理方括号内的内容,返回展开结果后再进行重复
- 栈操作法:使用栈结构保存当前处理状态,遇到
]时弹出栈顶元素进行计算
递归解法代码简洁但可能存在栈溢出风险,栈解法虽然代码稍长但更适合处理深度嵌套的情况。考虑到竞赛场景通常不会设置极端测试用例,两种方法都是可行的。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 递归解法实现详解
2.1 算法设计思路
递归解法的核心在于:
- 遍历字符串时维护当前索引位置
- 遇到数字时解析重复次数
- 遇到
[时递归处理子字符串 - 遇到
]时返回当前层的结果 - 字母字符直接拼接到结果中
2.2 C++代码实现
cpp复制#include <iostream>
#include <string>
using namespace std;
string expandString(const string& s, int& index) {
string result;
while (index < s.size() && s[index] != ']') {
if (isdigit(s[index])) {
int count = 0;
while (isdigit(s[index])) {
count = count * 10 +
