一、题目
二、思路
/** * 双栈:一个存储当前层的字符串结果,一个存储当前层前面的次数 * 当遇到数字时,记录当前数字(注意数字不只是个位数,也可能是两位数), * 遇到[时,把当前数字和当前字符串都放入栈, * 遇到字母时,把字母加入当前字符串, * 遇到]时,取出数字和字符串,用取出来的字符串循环追加当前层的临时字符串 */
图解:
1.初始状态
2.tempcount记录左括号前的数字
3.遇到左括号,ans和tempCount入栈
4.遇到字母a,ans追加
5.遇到数字,tempCount记录
6.遇到左括号,ans和tempCount入栈
7.遇到字母c,ans追加
8.遇到右括号,出栈,然后把出栈的sb循环append当前的ans
9.最后一个右括号,继续出栈,出栈的sb循环append当前的ans
三、代码
class Solution {
private Stack<StringBuilder> res = new Stack<>();
private Stack<Integer> counts = new Stack<>();
public String decodeString(String s) {
StringBuilder ans = new StringBuilder(); //记录临时字符串
int tempCount = 0; //记录临时操作数
for (char c : s.toCharArray()) {
//当前字符c是数字
if (Character.isDigit(c)) {
//可能不是个位数
tempCount = tempCount * 10 + (c - '0');
} else if (c == '[') { //c为左括号时
res.push(ans);
counts.push(tempCount);
ans = new StringBuilder(); //进入下一层
tempCount = 0;
} else if (Character.isLetter(c)) { //c为字母时
ans.append(c); //加入当前层的临时字符串
} else if (c == ']') { //c为右括号时
StringBuilder sb = res.pop();
Integer i = counts.pop();
for (int j = 0; j < i; j++) {
sb.append(ans); //拿上一层的ans去循环append这一层的ans,循环次数是进入这层时push的count
}
ans = sb;
}
}
return ans.toString();
}
}
技巧:这里使用了StringBuild,这样可以随时为某层动态添加字符串。