题目:
给定一个经过编码的字符串,返回它解码后的字符串。编码规则为: \(k[encoded_string]\),表示其中方括号内部的 $encoded_string $正好重复 \(k\) 次。注意$ k $保证为正整数。你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
思路:
本题直接去处理很难处理,我们可以调用数据结构栈来维护出答案。我们定义一个\(pair<int, string>\)类型的栈,当我们遇到数字我们先把它们存到一个空的\(vector\)里面,然后遇到非数字和括号字符,把字符存到一个字符串\(res\)里面。当我们遇到前括号''\([\)'',我们就把\(vector\)里面的数字字符转化为数字\(num\),再把\(num\)和\(res\)进行\(make pair\)一下存到栈里面。当遇到“\(]\)”,我们弹出栈顶元素,并把\(res\)更新为\(it.first * res + it.second\),依次遍历,直至栈空。
代码:
class Solution {
public:
string decodeString(string s) {
stack<pair<int, string>>stk;
int len = s.length();
string res = "";
string ans = "";
vector<int>num;
for(int i = 0; i < len; i ++ ){
if(s[i] == '[')
{
int dig = 0;
int cnt = 0;
for(int i = num.size() - 1; i >= 0; i --)
dig += num[i] * pow(10, cnt ++);
stk.push({dig,res});
res = "";
num.clear();
}
else if(s[i] >= 48 && s[i] <= 57) num.push_back(s[i] - '0');
else if(s[i] == ']')
{
auto it = stk.top();
stk.pop();
string res1 = "";
res1 += it.second;
for(int i = 1; i <= it.first; i ++ )
res1 += res;
res = res1;
if(stk.empty()){
ans = ans + res;
res = "";
}
}
else res += s[i];
}
return ans + res;
}
};