题目描述 小卢是一名密码学专业的学生,最近他发明了一种密码压缩的方式,如下所述: 对于连续的若干个相同的子串“X”会压缩为“[DX]”的形式(D 是一个整 数且 1≤D≤99),比如说字符串“CBCBCBCB”就压缩为“[4CB]”或者“[2[2CB]]”,类 似于后面这种压缩之后再压缩的称为二重压缩。如果是“[2[2[2CB]]]”则是三重的。 想必你应该看懂了小卢对密码的压缩方式,那么现在小卢会给你发一串被压缩的密码,请你对其进行解压缩。 输入输出格式 输入格式 输入一行,包含一个字符串,即被压缩的密码。 输出格式 输出一行,包含一个字符串,即解压缩后的密码。 输入输出样例1 输入 AC[3FUN] 输出 ACFUNFUNFUN 输入输出样例2 输入 BB[2[2HB]] 输出 BBHBHBHBHB 说明提示 【数据范围】 对于 50%的数据:解压后的字符串长度在 1000 以内,最多只有三重压缩。 对于 100%的数据:解压后的字符串长度在 20000 以内,最多只有十重压缩。 对于 100%的数据:保证只包含数字、大写字母、‘[’和‘]’用c++代码完成
时间: 2025-03-18 22:24:03 浏览: 80
下面是一个完整的 C++ 解法思路及代码实现:
### 思路分析
我们需要通过递归的方式来解析嵌套结构的压缩字符串。核心思想是逐字符读取并处理输入字符串,当遇到 `[` 或 `]` 时进入或退出递归层。
**步骤分解:**
1. 使用一个辅助函数来进行递归解析;
2. 当遇到字母直接拼接到结果字符串中;
3. 当遇到数字和左方括号 `[` 开始新的压缩块解析;
4. 在每个层次上记录当前层级的倍数,并返回该层次的结果给上级。
以下是完整代码示例:
```cpp
#include <iostream>
#include <string>
using namespace std;
// 辅助函数用于解码
string decode(string &s, int &i) {
string res = "";
while (i < s.size() && s[i] != ']') { // 直到碰到']'
if (!isdigit(s[i])) {
res += s[i]; // 如果不是数字,则添加到结果中
i++;
} else {
int k = 0;
// 计算数字大小 D
while (i < s.size() && isdigit(s[i])) {
k = k * 10 + (s[i]-'0');
i++;
}
i++; // 跳过 '['
string tmp = decode(s, i); // 获取内部内容
i++; // 跳过 ']' 后面的部分
for (int j = 0; j < k; ++j) { // 将临时字符串复制 K 次加入结果
res += tmp;
}
}
}
return res;
}
int main(){
string inputStr;
cin >> inputStr;
int index = 0; // 全局索引变量
cout << decode(inputStr, index);
return 0;
}
```
#### **详细解释:**
1. 函数 `decode()` 接收两个参数——待解压的字符串 `s` 和全局指针 `i`, 表明目前遍历的位置。
2. 主循环判断条件为未到达结尾且尚未匹配到结束符号`]`.
3. 若当前位置非数字则简单地将它累加至最终结果;若发现有连续数字开头的情况,则代表存在某个需要重复的模式段落:
- 提取出这个数值作为后续子串复刻次数K值,
- 然后跳过开始标记'[', 进入递归继续查找下一层级直至对应闭合标签']'.
4. 最终利用for循环按指定次数追加已经计算好的部分回总字符串里即可得到目标形式。
---
### 示例运行测试:
假设用户输入的是 "BB[2[2HB]]" ,那么程序工作流程大致如下:
| 步骤 | 描述 |
|------|-------------------------------|
| 初始状态 | 输入:"BB[2[2HB]]", 输出为空 |
| 第一步 | 添加前缀 BB |
| 再次深入第一个[]内 | 查找其内的规则"[2HB]" |
| 又再次深入第二层[]内 | 找出基础单元 HB 并设置乘数=2 |
| 返回上一级构建外层数组元素(共两次出现的HB)=HHBHHBH |
| 结束所有迭代过程输出最终答案: BB+HHBHHBHB="BBHBHBHBHB"|
最后得出结果:“BBHBHBHBHB”
阅读全文