报文解压缩
■ 题目描述
- 为了提升数据传输的效率,会对传输的报文进行压缩处理。
- 输入一个压缩后的报文,请返回它解压后的原始报文。
- 压缩规则:n[str],表示方括号内部的 str 正好重复 n 次。
- 注意 n 为正整数(0 < n <=
100),str只包含小写英文字母,不考虑异常情况。
输入描述:
输入压缩后的报文:
- 不考虑无效的输入,报文没有额外的空格,方括号总是符合格式要求的;
- 原始报文不包含数字,所有的数字只表示重复的次数 n ,例如不会出现像 5b
或 3[8] 的输入;
输出描述:
注:
示例 1
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3[k]2[mn]
输出
kkkmnmn
说明
- k 重复3次,mn 重复2次,最终得到 kkkmnmn
示例 2
输入输出示例仅供调试,后台判题数据一般不包含示例
输入
3[m2[c]]
输出
mccmccmcc
说明
- m2[c] 解压缩后为 mcc,重复三次为 mccmccmcc
思路:
我们全部压入栈后,遇到]
后弹出计算,然后再压会栈中,最后判断栈是否为空即可
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 50 51 52 53 54 55 56 57
| #include <bits/stdc++.h> using namespace std;
typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vi;
int main(){ string code; cin >> code; stack<string> st; string decode; int i = 0; string tmp; tmp = code[i]; st.push(tmp); while(!st.empty()){ i++; if(code[i] != ']' && i < code.size()){ string tmp; tmp = code[i]; st.push(tmp); }else{ string str; string num; while(!st.empty() && st.top() != "["){ str += st.top(); st.pop(); } if(!st.empty()){ st.pop(); } while(!st.empty() && st.top() >= "0" && st.top() <= "9"){ num += st.top(); st.pop(); } if(num != ""){ reverse(num.begin(), num.end()); int cnt = stoi(num); string strTmp; for(int i = 0; i < cnt; i++){ strTmp += str; } st.push(strTmp); } decode = str; } } reverse(decode.begin(), decode.end()); cout << decode << endl; return 0; }
|