【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
。