已知某字符串只含有小写字母,压缩之后的字符串包括数字、大括号、小写字符
请根据str还原字符串并返回
例如:3{2{abc}} abcabcabcabcabc
3{a}2{bc}aaabcbc
3{a2{c}}accaccacc
这是嵌套结构的典型递归模型
string getTimesString(int times, string base)
{
string res;
for (int i = 0; i < times; i++)
{
res.append(base);
}
return res;
}
//遍历的结果
//我转化到了什么位置停的
class ReturnData
{
public:
string restr;
int end;
ReturnData(string str, int nextIndex)
{
restr = str;
end = nextIndex;
}
};
//string 从Index出发 遇到结尾或者右括号 停
//这一段得到转化结果的字符串 ,以及处理到的位置 返回
ReturnData process(string chs, int index)
{
string res ;
int times = 0; //收集数字
while (index < chs.length() && chs[index] != '}') //遍历的过程中 Index不越界,且当前没有遇到“}”
{
if (chs[index] == '{') //1.遇到左括号,我不关心 我交给递归去执行
{
ReturnData returnData = process(chs, index + 1); // 递归扔到 index + 1位置去
res.append(getTimesString(times, returnData.restr));//我收集到的贴在result里
times = 0;
index = returnData.end + 1; //得到续算的位置
}
else //2.没有遇到左括号
{
if (chs[index] >= '0' && chs[index] <= '9') //2.1遇到数字 计数项值收集
{
times = times * 10 + chs[index] - '0';
}
if (chs[index] >= 'a' && chs[index] <= 'z')//2.2遇到字符 贴到result后面 index++
{
string temp = chs.substr(index, 1);//index位置取1个
res.append(temp);
// res.append(to_string(chs[index]));
}
index++;
}
}
ReturnData reData(res,index);
return reData;//终止位置返回我该返回的
}
string decompress(string decompressStr)
{
return process(decompressStr, 0).restr;
}