实现步骤:
//上面碰到[,把num=2和res=ak入栈,入栈后清空num和res
//上面碰到],开始真正拼接字符串,拼接res=bc,拼接num栈顶的次数也就是2,然后把ak拼接到两个bc的前面去,然后组成需要重复的字符串,然后num和str栈出栈
//又碰到],num出栈,需要akbcbc重复13次
代码:
public String decodeString(String s) {
int num = 0;
StringBuilder res = new StringBuilder();//存储最终结果
ArrayDeque<Integer> numStack = new ArrayDeque<>();//用来存重复的次数
ArrayDeque<String> strStack = new ArrayDeque<>();//存要重复的字符串。[后面的字符串需要压栈
for (char c : s.toCharArray()) {
if (c >= '0' && c <= '9') {
num = num * 10 + (c - '0');//数字可能有多位,如上面例子中最前面的13
} else if (c == '[') {//碰见[,把num放到num栈里,把res放到str栈里;并清空res和num
numStack.push(num);
strStack.push(res.toString());//start,end
res.delete(0, res.length());//字符串清空
num = 0;//清0
} else if (c == ']') {//对res进行拼接
String item = res.toString();//item为需要重复的项
// bug 修复:numStack.pop() 不应该放在 for 循环的比较地方,这样的话,会将所有的栈顶元素弹出
int itemCnt = numStack.pop();
for (int i = 1; i < itemCnt; i++) {//从1开始,因为有一个已经存在
res.append(item);
}
res.insert(0, strStack.pop());//上面图中ak要放到bcbc的前面去,生成下一次要重复的项akbcbc
} else {
res.append(c);//没碰到],之前用来累加存储
}
}
return res.toString();
}