算法(46)-递归-压缩字符串-C++

  已知某字符串只含有小写字母,压缩之后的字符串包括数字、大括号、小写字符
  请根据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;
	 }

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值