题目链接:
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. Docker容器内连接宿主机即CentOS的Mysql服务器

    docker的宿主机是虚拟机下的CentOS 博主最近遇到一种情况,从服务器拷贝了一份数据库在宿主机Mysql服务器上,想要用本地的数据库测试自己的代码正确性,但是项目程序都是靠docker一键部署的 ...

  2. Jakarta Java Mail属性参数配置

    前言 Jakarta Mail网址:https://eclipse-ee4j.github.io/mail SMTP协议可匹配的属性:https://eclipse-ee4j.github.io/ma ...

  3. 如何在自定义端口上运行 Spring Boot 应用程序?

    为了在自定义端口上运行 Spring Boot 应用程序,您可以在 application.properties 中指定端口. server.port = 8090

  4. 什么是 CAS?

    CAS 是 compare and swap 的缩写,即我们所说的比较交换. cas 是一种基于锁的操作,而且是乐观锁.在 java 中锁分为乐观锁和悲观锁.悲观锁是将资源锁住,等一个之前获得锁的线程 ...

  5. vue中v-model 数据双向绑定

    表单输入绑定 v-model 数据双向绑定,只能应用在input /textare /select <div id="app"> <input type=&quo ...

  6. Spring的@Enable*注解的工作原理

    转自:https://blog.csdn.net/chengqiuming/article/details/81586948 一 列举几个@Enable*注解的功能 @EnableAspectJAut ...

  7. 【动态系统的建模与分析】9_一阶系统的频率响应_低通滤波器_Matlab/Simulink分析

    magnitude response:振幅响应 phase response:相位响应 传递函数G(S)为什么将S看成jw化成G(jw)通过[动态系统的建模与分析]8_频率响应_详细数学推导 G(jw ...

  8. JQuery基础修炼-样式篇

    jQuery对象转化成DOM对象 jQuery库本质上还是JavaScript代码,它只是对JavaScript语言进行包装处理,为了是提供更好更方便快捷的DOM处理与开发常见中经常使用的功能.我们可 ...

  9. 使用 Blueprint 要注意 render_template 函数

    此文章主要是为了记录在使用 Flask 的过程中遇到的问题.本章主要讨论 render_template 函数的问题. 使用 Flask 的同学都应该知道,项目中的 url 和视图函数是在字典里一一对 ...

  10. 【前端Talkking】CSS系列——CSS深入理解之line-height

    1.写在前面 两个多周的时间没有写文章了,手好痒好痒,趁着公司在装修,从上周末到本周都在家办公,同时公司的项目并不紧急,于是抽着时间梳理了一下CSS中关于行高line-height的理解,今天发布出来 ...