题目描述
小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; }
|