解密字符串

1.4k 词

题目描述

小L收到了一份经过加密处理的字符串,需要进行对这些字符串进行解码,但是小L太菜了,根本不会写代码,因此希望你能来帮帮忙。

要求:给你一个经过加密的字符串,返回它解码后的字符串,编码规则为$k[string]$,其中方括号内部的$string$正好重复$k$次,并且$k$保证为正整数,输入字符串保证是有效的,输入字符串中没有额外的空格,且输入的方括号保证符合要求。

此外保证原始数据不包含数字,所有的数字值表示重复的次数,比如不会出现$4b$或者$5[6]$这种乱七八糟的输入。

输入

第一行输入一个整数$t$ $(1 \le t \le 10)$

接下来$t$行,每行输入一个编码后的字符串$s$ $(1 \le s.length \le 30)$

字符串$s$由小写英文字母、数字和方括号组成

$s$中所有整数范围在$[1,300]$之间 

输出

输出$t$行,每行一个解码后的字符串。

样例输入

1
2
3
4
5
4
3[a]2[bc]
3[a2[c]]
2[abc]3[cd]ef
abc3[cd]xyz

样例输出

1
2
3
4
aaabcbc
accaccacc
abcabccdcdcdef
abccdcdcdxyz

题解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include<bits/stdc++.h>
using namespace std;
string decodeString(string s) {
stack < string > st_string;
stack < int > st_num;
string temp = "";
int num = 0;
for (int i = 0; i < s.size(); i++) {
if (s[i] == '[') {
st_string.push(temp);
st_num.push(num);
num = 0;
temp = "";
}
if (s[i] == ']') {
int topn = st_num.top();
st_num.pop();
string tops = st_string.top();
st_string.pop();
for (int j = 0; j < topn; j++) {
tops = tops + temp;
}
temp = tops;
}
if (isdigit(s[i])) {
while (isdigit(s[i])) {
num = num * 10 + (s[i++] - '0');
}
i--;
}
if (isalpha(s[i])) {
while (isalpha(s[i])) {
temp = temp + s[i++];
}
i--;
}
}
return temp;
}
int main() {
int t;
scanf("%d", & t);
while (t--) {
string s;
cin >> s;
cout << decodeString(s) << "\n";
}
return 0;
}