题目链接:
https://www.lintcode.com/problem/282/description?_from=collection&fromId=208

描述:
小Q想要给他的朋友发送一个神秘字符串,但是他发现字符串太长了,于是小Q发明了一种压缩算法对字符串中重复的部分进行了压缩,对于字符串中连续的m个相同字符串S将会压缩为[m|S](m为一个整数且1<=m<=100),例如字符串ABCABCABC将会被压缩为[3|ABC],现在小A收到了小Q发送过来的字符串,你能帮助他进行解压缩么?

数据范围:
1、S的长度<=1000;
2、S仅包含大写字母、[、]、|;
3、解压后的字符串长度不超过100000;
4、压缩递归层数不超过10层;

样例:
输入 : "HG[3|B[2|CA]]F"
输出 : "HGBCACABCACABCACAF"
解释 : HG[3|B[2|CA]]F  −−>  HG[3|BCACA]F  −−>  HGBCACABCACABCACAF

解题思路:
首先先将最内层的方括号打开,如果我们找左括号想要找到最内层不太容易,所以我们应该先找右括号,第一个右括号肯定是最内层的压缩字符串,然后再在循环里从该右括号往前找'|'和左括号,然后将其解压,我的思路是将原字符串分成两部分s1和s2,然后将括号内压缩的字符串解压后构造成s3,最后将其拼接,一直这样遍历到原字符串结束。

具体代码如下:

class Solution {
public:
/**
* @param Message: the string xiao Q sent to xiao A.
* @return: the string after decompress
*/ string DecompressString(string &Message) {
string s1, s2;     //s1:前半串 s2:后半串
string s3 = "";     //部分解压后的字符串
int index = 0;     //'|'的位置
code:
for (int i = 0; i < Message.length(); i++)   //遍历右括号
{
if (Message[i] == ']')
{
s2 = Message.substr(i + 1, Message.length() - i - 1);   //截取后半段字符串
for (int j = i; ; j--)                      //往前找'|'和'['
{
string ts = "", tss = "";                  //ts:压缩字符串的个数,压缩的字符串
if (Message[j] == '|')index = j;
if (Message[j] == '[')
{
s1 = Message.substr(0, j);               //截取前半段字符串
for (int k = j + 1; k < index; k++)ts += Message[k];
int t = stoi(ts, 0, 10);                //将string型转为int型
for (int l = index + 1; l < i; l++)tss += Message[l];
for (int p = 0; p < t; p++)s3 += tss;        //构造s3
Message = s1 + s3 + s2;                 //拼接部分解压后的字符串
j += s3.length() - (j - i);              //将j、i的位置放到新串上
i = j;
s3 = "";                          //清空s3
goto code;                         //退出第一轮解压
}
}
}
}
return Message;
}
};

LintCode-282 · 解压字符串-题解的更多相关文章

  1. XJOI1424解压字符串

    解压字符串 给你一个字符串S,S是已经被加密过的字符串.现在要求你把字符串S还原.字符串S可能会出现这样的格式:k(q),它表示字符串q重复了k次,其中q是0个或多个字符,而k是一个数字,范围是0至9 ...

  2. python用模块zlib压缩与解压字符串和文件的方法

    摘自:http://www.jb51.net/article/100218.htm Python标准模块中,有多个模块用于数据的压缩与解压缩,如zipfile,gzip, bz2等等. python中 ...

  3. C# 压缩与解压字符串(面试题)

    /* * 题目:压缩字符串.如“abbcccddddeef”,压缩成“a1b2c3d4e2f1” * 解题: 这个题目也是面试常见的题目.看似很简单,其实暗藏杀机.一般的想法就是,一边遍历,一边计数, ...

  4. python使用zlib实现压缩与解压字符串

    命令 字符串:使用zlib.compress可以压缩字符串.使用zlib.decompress可以解压字符串. 数据流:压缩:compressobj,解压:decompressobj 案例 >& ...

  5. PAT 乙级 1078 字符串压缩与解压 (20)

    文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表示.如果字符没有重复,就原样输出.例如 ...

  6. PAT 1078 字符串压缩与解压(20)(代码+思路)

    1078 字符串压缩与解压(20 分) 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表 ...

  7. PAT 1078 字符串压缩与解压

    https://pintia.cn/problem-sets/994805260223102976/problems/994805262018265088 文本压缩有很多种方法,这里我们只考虑最简单的 ...

  8. PAT(B) 1078 字符串压缩与解压(Java)

    题目链接:1078 字符串压缩与解压 (20 point(s)) 题目描述 文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示 ...

  9. PAT Basic 1078 字符串压缩与解压 (20 分)

    文本压缩有很多种方法,这里我们只考虑最简单的一种:把由相同字符组成的一个连续的片段用这个字符和片段中含有这个字符的个数来表示.例如 ccccc 就用 5c 来表示.如果字符没有重复,就原样输出.例如  ...

随机推荐

  1. 什么是Spring IOC 容器?

    Spring IOC 负责创建对象,管理对象(通过依赖注入(DI),装配对象,配置对象,并且管理这些对象的整个生命周期.

  2. Java中自动装箱与拆箱

    一.什么是封装类? Java中存在基础数据类型,但是在某些情况下,我们要对基础数据类型进行对象的操作,例如,集合中只能存在对象,而不能存在基础数据类型,于是便出现了包装器类.包装器类型就是对基本数据类 ...

  3. AOP 有哪些实现方式?

    实现 AOP 的技术,主要分为两大类: 静态代理 指使用 AOP 框架提供的命令进行编译,从而在编译阶段就可生成 AOP 代理类, 因此也称为编译时增强: 编译时编织(特殊编译器实现) 类加载时编织( ...

  4. 攻防世界 web_php_include

    Web_php_include 进入题目源码直接出来了 <?php show_source(__FILE__); echo $_GET['hello']; $page=$_GET['page'] ...

  5. cpu指令如何读写硬盘

    我们提到cpu的主要作用之一就是控制设备之间的数据交互.这其中自然也包括了硬盘.系统的所有数据基本都在硬盘中,所以知道怎么读写硬盘,对程序来说非常重要,所以我们先来探索下传说中的pio模式. cpu要 ...

  6. 前端规范(ES6BEMOOCSSSMACSS)

    前端规范 在实际开发中,由于团队成员编码习惯不一,技术层次不同,开发前定制并遵循一种代码规范能提高代码质量,增加开发效率. Javascript Javascript规范直接参考airbnb: ES6 ...

  7. js和原生应用常用的数据交互方式

    场景1 在原生app中经常会使用到H5页面,比如说电商中的活动页,一些电商中的详情页,等等...这些页面都有一个特点,那就是在未来修改的可能性,和一次性的几率特别的大.所以用H5的页面是最睿智的一种选 ...

  8. Java/C++实现代理模式---婚介所

    婚介所其实就是找对象的一个代理,请仿照我们的课堂例子"论坛权限控制代理"完成这个实际问题,其中如果年纪小于18周岁,婚介所会提示"对不起,不能早恋!",并终止业 ...

  9. Bitmap图片的处理

      一.View转换为Bitmap 在Android中所有的控件都是View的直接子类或者间接子类,通过它们可以组成丰富的UI界面.在窗口显示的时候Android会把这些控件都加载到内存中,形成一个以 ...

  10. Node自动重启工具 nodemon

    为什么要使用 在编写调试Node.js项目,修改代码后,需要频繁的手动close掉,然后再重新启动,非常繁琐.现在,我们可以使用nodemon这个工具,它的作用是监听代码文件的变动,当代码改变之后,自 ...