[394. 字符串解码]
难度 中等
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string]
,表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a
或 2[4]
的输入。
示例:
s = "3[a]2[bc]", 返回 "aaabcbc".
s = "3[a2[c]]", 返回 "accaccacc".
s = "2[abc]3[cd]ef", 返回 "abcabccdcdcdef".
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/decode-string
解法一:栈
-
当 c 为数字时,则将其转化为乘数 multi,用于后续倍数计算;
-
当 c 为字母时,在 ans 尾部添加 c;
-
当 c 为 [ 时,将当前 multi 和 ans 入栈,并分别置空置 0 和 “”:
记录此 [ 前的临时结果 ans 至栈,用于发现对应 ] 后的拼接操作;
记录此 [ 前的倍数 multi 至栈,用于发现对应 ] 后,获取 multi × […] 字符串。
-
进入到新 [ 后,ans 和 multi 重新记录。
-
当 c 为 ] 时,stack 出栈,拼接字符串 res = last_res + cur_multi * ans ,其中:
stackMultiple 是上个 [ 到当前 [ 的字符串,例如 “3[a2[c]]” 中的 a;
stackans 是当前 [ 到 ] 内字符串的重复倍数,例如 “3[a2[c]]” 中的 2。
class Solution {
public String decodeString(String s) {
String ans = "";
Stack<Integer> stackMultiple = new Stack();
Stack<String> stackans = new Stack();
Integer multiple = 0;
for(char c : s.toCharArray()) {
if(c == '[') {
stackMultiple.push(multiple);
stackans.push(ans);
multiple = 0;
ans = "";
}
else if(c == ']') {
String temp = "";
int curMulti = stackMultiple.pop(); //获取乘数
for(int i = 0; i < curMulti; i++) {
temp += ans;
}
//stackans.pop()为上个 [ 到当前 [ 的字符串
ans = stackans.pop() + temp;
}
else if('0' <= c && c <= '9') {
multiple = multiple * 10 + Integer.parseInt(c + "");
}else {
ans += c;
}
}
return ans;
}
}