【牛客网】压缩算法C++解法
string decode(string s)
{
int x=-1,y=-1,z=-1;
int times;
string sub,result;
for(int i=0;i<s.length();++i)
{
if (s[i]=='[') //左括号
x = i;
else if (s[i]=='|')
y = i;
else if (s[i]==']') //右括号
{
z = i;
break;
}
}
if (x!=-1 && y!=-1 && z!=-1)
{
times = atoi(s.substr(x+1,y-x-1).c_str());
sub = s.substr(y+1,z-y-1);
string ss="";
for (int i=0;i<times;++i) //重复字段
ss += sub;
result = s.substr(0,x) + ss + s.substr(z+1,s.length());
return decode(result);
}
return s;
}
解法思想:x,y,z始终指向当前字符串最内层需要解压缩的相应位置,将解压缩后字符串作为下次递归的输入。
如输入"[3|B[4|A]]"
第一次递归返回结果:[3|BAAAA]
第二次递归返回结果:BAAAABAAAABAAAA
第三次递归返回结果:BAAAABAAAABAAAA (不进入递归,直接返回)