【LeetCode-394】字符串解码

问题

给定一个经过编码的字符串,返回它解码后的字符串。

编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。

你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。

此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。

示例

输入: s = "3[a2[c]]"
输出: "accaccacc"

解答

class Solution {
public:
    string decodeString(string s) {
        stack<pair<int, string>> stk;
        int num = 0;
        string res;
        for (char ch : s) {
            if (isdigit(ch)) num = 10 * num - '0' + ch;
            else if (ch == '[') { // 当前层级暂存(入栈)
                stk.push(make_pair(num, res));
                res.clear(); // 初始化以存储下一层的数字和字母
                num = 0;
            }
            else if (ch == ']') { // 当前层级结束(出栈)
                auto [preNum, preStr] = stk.top(); stk.pop();
                for (int i = 0; i < preNum; i++)
                    preStr += res;
                res = preStr;
            }
            else res += ch;
        }
        return res;
    }
};

重点思路

遇到[时入栈,前面的状态暂存;遇到]时出栈,将当前层的res与上一层(栈顶)暂存元素结合,即res = preStr + preNum * res

posted @ 2021-04-04 23:21  tmpUser  阅读(44)  评论(0编辑  收藏  举报