39. 解压报文

87 阅读2分钟

题目描述

  • 为了提升数据传输的效率,会对传输的报文进行压缩处理。
  • 输入一个压缩后的报文,请返回它解压后的原始报文。
  • 压缩规则: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;
}