题目:
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例:
s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
思路:
这里要明白入栈的元素到底是什么,由于这里是一个从左到右,从里到外的过程。我们对2[bc]进行操作的时候,需要知道bc之前的字符串的拼接结果和对bc的操作次数(即2)。那么我们就要存储这两个信息,可以用pair<int,string>的结构。接下来就是分情况进行讨论。当字符为数字的时候,用times记录数字的大小;当字符为'['时,意味着新的解码即将要开始,所以要把旧的数据res以及新的解码进行的次数以pair的形式存入栈中,同时将res置为空,times置为0,方便进行后面的解码操作。当字符为英文字母的时候,用res存放这一连串的字符。当字符为‘]’的时候,就可以计算当前的字符串的结果了,需要取出之前栈的首元素信息,然后进行拼接。
代码:
class Solution {
private:
string repeatStr(string T, int times)
{
string ans = "";
for (int i = 0; i < times; i++)
{
ans += T;
}
return ans;
}
public:
string decodeString(string& s) {
//int len = s.size();
int times = 0;
string res = "";
typedef pair<int, string> pa;
vector<pair<int, string>>st;
for (auto c : s)
{
if (c >= '0' && c <= '9') times = times * 10 + (c - '0');
else if (c == '[')
{
st.push_back(pa(times, res));
res = "";
times = 0;
}
else if(c==']')
{
pa temp = st[st.size()-1];
st.pop_back();
res = temp.second + ((temp.first==0)? "" : repeatStr(res,temp.first));
}
else
{
res += c;
}
}
return res;
}
};