题目描述
- 为了提升数据传输的效率,会对传输的报文进行压缩处理。
- 输入一个压缩后的报文,请返回它解压后的原始报文。
- 压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。
- 注意 n 为正整数(0 < n <= 100),str只包含小写英文字母,不考虑异常情况。
输入描述
输入压缩后的报文:
1)不考虑无效的输入,报文没有额外的空格,方括号总是符合格式要求的;
2)原始报文不包含数字,所有的数字只表示重复的次数 n ,例如不会出现像 5b 或 3[8] 的输入;
输出描述
解压后的原始报文
注:原始报文长度不会超过1000,不考虑异常的情况
用例
| 输入 | 3[k]2[mn] |
|---|---|
| 输出 | kkkmnmn |
| 说明 | k 重复3次,mn 重复2次,最终得到 kkkmnmn |
| 输入 | 3[m2[c]] |
|---|---|
| 输出 | mccmccmcc |
| 说明 | m2[c] 解压缩后为 mcc,重复三次为 mccmccmcc |
#include <iostream>
#include <stack>
#include <string>
using namespace std;
/*
遍历字符串:
如果当前字符是数字,更新 k。
如果当前字符是 [,将 k 和 currentString 压入栈中,并重置 k 和 currentString。
如果当前字符是 ],从栈中弹出之前的字符串和重复次数,构建解压后的字符串,并更新 currentString。
如果当前字符是字母,直接添加到 currentString 中。
*/
int main()
{
string input;
cin >> input;
string currentString; // 存储当前解压的部分
stack<int> countSt; // 存储重复次数和当前字符串
stack<string> st;
int k = 0;
for (char c : input)
{
if (isdigit(c))
{
k = k * 10 + (c - '0');
}
else if (c == '[')
{
countSt.push(k);
st.push(currentString);
currentString = "";
k = 0;
}
else if (c == ']')
{
string temp = st.top();
st.pop();
int count = countSt.top();
countSt.pop();
for (int i = 0; i < count; i++)
{
temp += currentString;
}
currentString = temp;
}
else
{
currentString += c;
}
}
std::cout << currentString << std::endl;
return 0;
}