[LeetCode] Decode String 题解
题目
s = "3[a]2[bc]", return "aaabcbc".
s = "3[a2[c]]", return "accaccacc".
s = "2[abc]3[cd]ef", return "abcabccdcdcdef".
大概意思是根据指定的格式将字符串进行展开
思路
- 递归的思路
递归计算出括号最里面的字符串,依次再处理外面一层的字符串,每个单元内的字符串类似于一个结点,个数则为结点的个数。父结点则是将这些个数的字符串组合在一起,以此类推到跟结点,就是我们要求的结果。
- 迭代的思路
用两个栈来分别保存下单元中的个数,另一个则保存单元中的字符串,注意的是,要将最新的处理完后的字符串加入到栈中。一直加入,直到最后返回栈顶字符串则为所求结果。
实现
//
//
#include "../PreLoad.h"
/*
s = "3[a]2[bc]", return "aaabcbc".
s = "3[a2[c]]", return "accaccacc".
s = "2[abc]3[cd]ef", return "abcabccdcdcdef".
*/
class Solution {
public:
// 错误做法
string decodeString(string s) {
if (s == "") {
return "";
}
string result = "";
stack<pair<char, int>> codes;
codes.push({s[0], 0});
while (!codes.empty()) {
auto content = codes.top();
codes.pop();
// 表明开始是数字
if (content.first >= '0' && content.first <= '9') {
int start = content.second;
string nums = "";
nums.push_back(content.first);
while (s[start] != '\n' && s[start] != '[') {
content.first += s[start];
start++;
}
// 计算单位的字符串
int num = atoi(nums.c_str());
string str = "";
for (int i = 0; i < num; i++) {
str += content.first;
}
result += str;
// 找到下一个单位起始的位置
while (s[start] != '\n' && s[start] != ']') {
start++;
}
if (start != s.size()-1) {
start++;
codes.push({s[start], start});
}
}
}
return result;
}
/**
* 迭代DFS的做法
*
* @param s
* @return
*/
string decodeString2(string s) {
int cnt = 0; //每个单元里的数字个数
string content = "";
int len = s.size();
int i = 0;
stack<string> strs;
stack<int> cnts;
while (i < len) {
// 为数字的情况
if (i < len && s[i] >= '0' && s[i] <= '9') {
cnt = cnt * 10 + (s[i] - '0');
}
// 为左括号的情况
else if (i < len && s[i] == '[') {
cnts.push(cnt);
strs.push(content); //因为存在内嵌的情况,所以保存下之前的单元内的字符串
cnt = 0;
content.clear(); //清空用来保存后面单元的字符串
}
// 为右括号的情况
else if (i < len && s[i] == ']') {
int cnt_temp = cnts.top();
cnts.pop();
while (cnt_temp--) {
strs.top() += content;
}
// 将之前的字符串进行累加以后得到新的单元的内容
content = strs.top();
strs.pop();
}
// 中间的字符串
else {
content += s[i];
}
i++;
}
// 可能存在没有]的单元
return strs.empty() ? content : strs.top();
}
/**
* 递归DFS
* 计算单元格内字符串的内容,再根据个数进行累加
* 注意字符串下标和边界条件
*
* @param s
* @return
*/
string decodeString3(string s) {
int len = s.size();
if (len == 0) {
return "";
}
int i = 0;
return decodeHelper(s, i);
}
string decodeHelper(string s, int& i) {
string result = "";
int len = s.size();
while (i < len && s[i] != ']') {
// 非数字而是字符的情况下
if (s[i] < '0' || s[i] > '9') {
result += s[i++];
}
else {
// 计算数字
int cnt = 0;
while (s[i] >= '0' && s[i] <= '9' && i < len) {
cnt = cnt * 10 + (s[i++] - '0');
}
// 移动到字符串开始的位置
i++;
// 获得单元内的字符串,此时递归返回i的位置是]的位置
string str = decodeHelper(s, i);
//移动到下一个单元的位置
i++;
while (cnt--) {
result += str;
}
}
}
return result;
}
void test() {
string str = "3[a2[c]]";
cout << "result : " << decodeString3(str) << endl;
}
};
总结:这些和在树中使用DFS的思想是类似的。
[LeetCode] Decode String 题解的更多相关文章
- [LeetCode] Decode String 解码字符串
Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...
- LeetCode——Decode String
Question Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string ...
- [LeetCode] 394. Decode String 解码字符串
Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...
- LeetCode 394. 字符串解码(Decode String) 44
394. 字符串解码 394. Decode String 题目描述 给定一个经过编码的字符串,返回它解码后的字符串. 编码规则为: k[encoded_string],表示其中方括号内部的 enco ...
- [LeetCode] Encode String with Shortest Length 最短长度编码字符串
Given a non-empty string, encode the string such that its encoded length is the shortest. The encodi ...
- [LeetCode] Decode Ways 解题思路
A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...
- LeetCode——Reverse String
LeetCode--Reverse String Question Write a function that takes a string as input and returns the stri ...
- Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串)
Leetcode 8. String to Integer (atoi) atoi函数实现 (字符串) 题目描述 实现atoi函数,将一个字符串转化为数字 测试样例 Input: "42&q ...
- Leetcode -- 394. Decode String
Given an encoded string, return it's decoded string. The encoding rule is: k[encoded_string], where ...
随机推荐
- Python系列之Collections内置模块(2)
defaultdict 返回一个类 dict 的对象,defaultdict 是内置的 dict 类的子类. 如果访问 dict 未初始化的 key 值时,会抛出 KeyError 异常. s_tup ...
- lable 以及cell的高度自适应
1.先cell自适应 可以先拿到 这个lable里文字的高度 //lable自适应的高度 -(CGFloat)heightWithString:(NSString *)aString { CGRect ...
- H5中背景音乐无法自动播放问题
苹果禁止了Autoplay和JS "onload" 加载播放,使在html文件里使用了preload和autoplay属性,在移动版 Safari 上,此属性会被忽视,并且不会加载 ...
- ROM与RAM知识
“ROM”和“RAM”的意思: “ROM”:N年前代表一种只能写入和读取,而不能改写和擦除的设备,可以用光驱CD-ROM来说明这个道理.目前的“ROM”已经不是这个道理了,它的技术已经飞快的发展到现在 ...
- BZOJ1115:[POI2009]石子游戏Kam(博弈论)
挺水的 听说是阶梯nim和,就去看了一下,然后就会了= = 观察题目,发现拿第i堆棋子k个造成的影响就是第i+1堆棋子能多拿k个 可以把模型转化为,有n堆石子,每次从某一堆拿一个石子,放在下一堆中,不 ...
- 在SQL Server里如何处理死锁
在今天的文章里,我想谈下SQL Server里如何处理死锁.当2个查询彼此等待时会发生死锁,没有一个查询可以继续它们的操作.首先我想给你大致讲下SQL Server如何处理死锁.最后我会展示下SQL ...
- C# winform程序免安装.net framework在XP/win7/win10环境运行!
前文: 首先感谢群里的大神宇内流云 提供的anyexec for windows版本. 经过本人搭建虚拟机在xp环境 使用anyexec运行winfrom程序后,测试通过,如下是用的xp运行winfr ...
- 2017-2-19 C#基础 数据类型
数据类型分为基本数据类型和引用类型.基本数据类型分为两大类,值类型,字符型(char)和布尔型(bool).其中值类型分为整型和浮点型.整型分为byte,short,int,long.常用的是int( ...
- php中的实用分页类
<table width="100%" border="1" cellpadding="0" cellspacing="0& ...
- Nginx+tomcat动静分离安装脚本
#!/bin/bashsetenforce 0systemctl stop firewalldtar -zxvf nginx-1.8.0.tar.gz -C /usr/src/ cd /usr/src ...