题目:
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string]
,表示其中方括号内部的 encoded_string
正好重复 k
次。注意 k
保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k
,例如不会出现像 3a
或 2[4]
的输入。
代码:
class Solution {
public String decodeString(String s) {
int k = 0;
StringBuilder res = new StringBuilder();
Stack<Integer> kstack = new Stack<>();
Stack<StringBuilder> restack = new Stack<>();
for (char c : s.toCharArray()) {
if (c == '[') {
// 碰到括号,记录K和当前res,归零。
kstack.push(k);
restack.push(res);
k = 0;
res = new StringBuilder();
}else if(c ==']') {
// 出最近的一个左括号入的k,当前res进行计算不入栈
int curk = kstack.pop();
StringBuilder temp = new StringBuilder();
for(int i = 0; i < curk; i++) {
temp.append(res);
}
// 与括号外合并
res = restack.pop().append(temp);
}else if (c >= '0' && c <= '9') {
k = c - '0' + k * 10;
// 如果k是多位数需要x10
}else {
res.append(c);
// 如果是字母则缓慢添加
}
}
return res.toString();
}
}