题目
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: 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]
解答
源代码
class Solution {
public String decodeString(String s) {
LinkedList<Character> stack = new LinkedList<>();
for (char ch : s.toCharArray()) {
if (ch != ']') {
stack.offerLast(ch);
} else {
StringBuilder sb = new StringBuilder();
// 1. 将"["之前的字符都出栈
while (stack.peekLast() != '[') {
sb.insert(0, stack.pollLast());
}
String str = sb.toString();
// 将"["出栈
stack.pollLast();
// 2. 将数字字符出栈
sb = new StringBuilder();
while (!stack.isEmpty() && Character.isDigit(stack.peekLast())) {
sb.insert(0, stack.pollLast());
}
int num = Integer.parseInt(sb.toString());
// 3. 进行解码
sb = new StringBuilder();
while (num > 0) {
sb.append(str);
num--;
}
// 4. 将解码后的字符都放入栈中
for (char c : sb.toString().toCharArray()) {
stack.offerLast(c);
}
}
}
// 将栈中解码后的字符都拿出来
StringBuilder code = new StringBuilder();
while (!stack.isEmpty()) {
code.insert(0, stack.pollLast());
}
return code.toString();
}
}
总结
这题思路倒是不难写,只是每次遇到字符串的时候细节问题一大堆,不停调试编译(捂脸)。
方括号会嵌套,那么我们需要一个个进行解码。如" 3[a2[c]] ",我们需要先解码为" 3[acc] ",再解码为" accaccacc "。
遍历字符串,把每个字符放入栈中,直到遇到一个" ] ",这就说明已经读完一个完整的方括号内容了,那么此时进行出栈,直到出栈到" [ ",将这期间的字符保存起来。
这里要注意一下,栈的特点是先进后出,所以这里出栈时需要用到 StringBuilder.insert()函数,把每个字符插入到首部。
字符保存完之后,把" [ "出栈,接下来一定是这个方括号对应的数字,然后将数字对应的字符出栈保存起来。
根据这个方括号内的字符和对应的数字得到一个新的字符串,将这个字符串的字符都压入栈中。文章来源:https://www.toymoban.com/news/detail-681558.html
遍历完整个字符串,栈中的字符就是我们所要求的,将字符一个个出栈,转换为字符串后返回。文章来源地址https://www.toymoban.com/news/detail-681558.html
到了这里,关于【LeetCode】394.字符串解码的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!