licoded / self-study-drafts

buffer for records
0 stars 0 forks source link

一道面试编程题:字符串展开 #159

Open licoded opened 10 months ago

licoded commented 10 months ago
#include <iostream>
#include <cstring>
#include <stack>

using namespace std;

string decompress(const string &compressed_)
{
    string compressed = compressed_;
    stack<char> stack;
    while (!stack.empty())
        stack.pop();

    for (char c : compressed)
    {
        if (c == ')')
        {
            vector<char> v;

            while (stack.top() != '(')
            {
                v.push_back(stack.top());
                stack.pop();
            }
            stack.pop();

            int times = stack.top() - '0';
            stack.pop();

            for (int i = 0; i < times; i++)
            {
                for (int j = v.size() - 1; j >= 0; j--)
                {
                    stack.push(v[j]);
                }
            }
        }
        else
        {
            stack.push(c);
        }
    }

    string res = "";
    while (!stack.empty())
    {
        res += stack.top();
        stack.pop();
    }
    reverse(res.begin(), res.end());
    return res;
}

int main()
{
    string compressed = "2(a3(b))2(cd)e2(f)";
    // string compressed = "2(a3(b))";
    // string compressed = "2(a)";
    string decompressed = decompress(compressed);
    cout << decompressed << endl;

    return 0;
}