题目链接:
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. Error和Exception有什么区别?

    Error表示系统级的错误和程序不必处理的异常,是恢复不是不可能但很困难的情况下的一种严重问题:比如内存溢出,不可能指望程序能处理这样的情况:Exception表示需要捕捉或者需要程序进行处理的异常, ...

  2. Files的常用方法都有哪些?

    Files. exists():检测文件路径是否存在.Files. createFile():创建文件.Files. createDirectory():创建文件夹.Files. delete():删 ...

  3. Spring支持的事务管理类型?

    Spring支持两种类型的事务管理: 编程式事务管理 :这意味你通过编程的方式管理事务,给你带来极大的灵活性,但是难维护. 声明式事务管理: 这意味着你可以将业务代码和事务管理分离,你只需用注解和XM ...

  4. Mybaits 的优点?

    1.基于 SQL 语句编程,相当灵活,不会对应用程序或者数据库的现有设计造成任 何影响,SQL 写在 XML 里,解除 sql 与程序代码的耦合,便于统一管理:提供 XML 标签,支持编写动态 SQL ...

  5. 用 Java 写一个折半查找?

    折半查找,也称二分查找.二分搜索,是一种在有序数组中查找某一特定元素的搜索算法. 搜素过程从数组的中间元素开始,如果中间元素正好是要查找的元素,则搜素过程结束:如果某一特定元素大于或者小于中间元素,则 ...

  6. Effective Java —— 覆盖equals时遵守通用约定

    本文参考 本篇文章参考自<Effective Java>第三版第十条"Obey the general contract when overriding equals" ...

  7. 如何保证同事的代码不会腐烂?一文带你了解 阿里巴巴 COLA 架构

    一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情. 本文开始前,问大家一个问题,你觉得一份业务代码,尤其是互联网业务代码,都有哪些特点? 我能想到的有这几点: ...

  8. pydev+eclipse写python代码

    首先,下载pydev:PyDev for Eclipse - Browse /pydev at SourceForge.net (建议下载到本地,之前看其他文章时,进行了如下安装: 启动 Eclips ...

  9. 每日所学之自学习大数据的Linux环境的配置

    今天开始配置环境,因为下载镜像文件需要很长时间,加上训练,所以Linux环境之配置了一半 VMware下载及安装教程(Window) 在安装虚拟机时需要下载镜像文件 下面是我下载的镜像文件的地址 Ce ...

  10. 微信h5静默和非静默授权获取用户openId和用户信息的方法和步骤:

    原文链接:https://blog.csdn.net/qq_35430000/article/details/79299529 一.openId是什么?openId是用户在当前公众号下的唯一标识('身 ...