【题目描述】
有一种字符串压缩编码:
普通的小写字母原样表示自身;
k[s] 表示把括号内的内容 s 重复 k 次,其中 k 是正整数(可能是多位数);
编码可以嵌套,例如 3[a2[c]] 解码为 accaccacc。
给定一个编码串,请输出解码后的字符串。
【输入格式】
一行一个字符串,表示编码串。由小写字母、数字、[、] 组成,保证格式合法:数字只出现在 [ 之前,括号正确配对。
【输出格式】
一行一个字符串,表示解码结果。
【样例输入 #1】
3[a2[c]]
【样例输出 #1】
accaccacc
【样例输入 #2】
2[abc]3[cd]ef
【样例输出 #2】
abcabccdcdcdef
【数据范围与约定】
测试点 编码串长度 解码结果长度
1~10 ≤ 20 ≤ 500
11~16 ≤ 60 ≤ 500
17~19 ≤ 110 ≤ 10 000
20 91 1(30 层嵌套)
【提示】
第 20 组虽然只有 91 个字符,但括号嵌套深度达到 30 层。
#include <bits/stdc++.h>
using namespace std;
string s, ans;
stack<string> str;
stack<int> sn;
int x;
void wk(int x)
{
string kkksc03 = str.top();
str.pop();
string res;
while (x--)
{
res += kkksc03;
}
if (!str.empty())
{
str.top() += res;
}
else
{
str.push(res);
}
}
int main()
{
cin >> s;
str.push("");
for (int i = 0; i < s.size(); i++)
{
if (isdigit(s[i]))
{
x = x * 10 + (s[i] - '0');
}
else
{
string t;
switch (s[i])
{
case '[':
sn.push(x);
x = 0;
str.push("");
break;
case ']':
wk(sn.top());
sn.pop();
break;
default:
t = s[i];
str.top() += t;
}
}
}
ans = str.top();
cout << ans;
return 0;
}
浙公网安备 33010602011771号