字符串解码
难度:
标签:
题目描述
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string]
,表示其中方括号内部的 encoded_string
正好重复 k
次。注意 k
保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k
,例如不会出现像 3a
或 2[4]
的输入。
示例 1:
输入:s = "3[a]2[bc]" 输出:"aaabcbc"
示例 2:
输入:s = "3[a2[c]]" 输出:"accaccacc"
示例 3:
输入:s = "2[abc]3[cd]ef" 输出:"abcabccdcdcdef"
示例 4:
输入:s = "abc3[cd]xyz" 输出:"abccdcdcdxyz"
提示:
1 <= s.length <= 30
s
由小写英文字母、数字和方括号'[]'
组成s
保证是一个 有效 的输入。s
中所有整数的取值范围为[1, 300]
代码结果
运行时间: 18 ms, 内存: 16.0 MB
/*
* 解题思路:
* 使用递归方法处理字符串解码。
* 当检测到']'时,返回当前解析的字符串。
* 遇到'['时,递归解析方括号内的字符串,得到部分结果。
* 遇到数字时,解析完整数字并进行相应次数的递归。
*/
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class DecodeStringStream {
public String decodeString(String s) {
return decode(s, new int[]{0});
}
private String decode(String s, int[] index) {
StringBuilder result = new StringBuilder();
int num = 0;
while (index[0] < s.length()) {
char c = s.charAt(index[0]++);
if (Character.isDigit(c)) {
num = num * 10 + (c - '0');
} else if (c == '[') {
String inner = decode(s, index);
result.append(IntStream.range(0, num).mapToObj(i -> inner).collect(Collectors.joining()));
num = 0;
} else if (c == ']') {
break;
} else {
result.append(c);
}
}
return result.toString();
}
}
解释
方法:
这个题解使用了一个栈来保存括号外面的状态。当遇到'['时,将当前的multi和res压入栈中,然后重置它们。当遇到']'时,从栈中弹出上一层的multi和res,并将当前的res乘以multi次,然后与上一层的res相连。如果遇到数字,则更新multi的值。如果遇到字母,则将其添加到当前的res中。
时间复杂度:
O(n)
空间复杂度:
O(n)
代码细节讲解
🦆
在解码过程中,如果遇到嵌套的括号如何处理?例如输入'3[a2[c]]'中的嵌套如何确保正确解码?
▷🦆
对于数字的处理,为什么选择`multi = multi * 10 + int(c)`的方式更新multi的值?这种方法在什么情况下可能会遇到问题?
▷🦆
在将字符添加到res时,如果输入字符串包含连续的字母(如'abc'),这种方法是否能够正确处理,并且是否有效率上的考量?
▷🦆
当遇到']'字符时,代码如何确保从栈中弹出的multi和res是正确的?栈的结构在这里起了什么作用?
▷相关问题
原子的数量
给你一个字符串化学式 formula
,返回 每种原子的数量 。
原子总是以一个大写字母开始,接着跟随 0 个或任意个小写字母,表示原子的名字。
如果数量大于 1,原子后会跟着数字表示原子的数量。如果数量等于 1 则不会跟数字。
- 例如,
"H2O"
和"H2O2"
是可行的,但"H1O2"
这个表达是不可行的。
两个化学式连在一起可以构成新的化学式。
- 例如
"H2O2He3Mg4"
也是化学式。
由括号括起的化学式并佐以数字(可选择性添加)也是化学式。
- 例如
"(H2O2)"
和"(H2O2)3"
是化学式。
返回所有原子的数量,格式为:第一个(按字典序)原子的名字,跟着它的数量(如果数量大于 1),然后是第二个原子的名字(按字典序),跟着它的数量(如果数量大于 1),以此类推。
示例 1:
输入:formula = "H2O" 输出:"H2O" 解释:原子的数量是 {'H': 2, 'O': 1}。
示例 2:
输入:formula = "Mg(OH)2" 输出:"H2MgO2" 解释:原子的数量是 {'H': 2, 'Mg': 1, 'O': 2}。
示例 3:
输入:formula = "K4(ON(SO3)2)2" 输出:"K4N2O14S4" 解释:原子的数量是 {'K': 4, 'N': 2, 'O': 14, 'S': 4}。
提示:
1 <= formula.length <= 1000
formula
由英文字母、数字、'('
和')'
组成formula
总是有效的化学式