一个栈
算法思路
- 把
s分成一层一层,[...[为一层,把s旋转90度,看起来就像栈一样,如下图。 - 遇到
[,就把当前层的数字和字符串压入栈。 - 当前层的数字表示下一层要重复多少次,当前层的字符串作为
prev,与重复后的下一层拼接。
下面再举一个例子
代码简直就是String和StringBuffer的API大杂烩
class Solution {
public String decodeString(String s) {
// 使用一个 StringBuffer 栈保存遇到 [ 前的字符串
Deque<StringBuffer> stack = new ArrayDeque<>();
// [ 前遇到的字符
StringBuffer curStr = new StringBuffer();
// [ 前遇到的数字
int curNum = 0;
// 遍历 s 的每个字符
for (char ch : s.toCharArray()) {
if (Character.isDigit(ch)) {
curNum = curNum * 10 + (ch - '0');
} else if (ch == '[') {
// 先把数字压入栈
stack.addFirst(new StringBuffer(String.valueOf(curNum)));
// 重置,准备保存下一个数字
curNum = 0;
// 再把字符压入栈
stack.addFirst(new StringBuffer(curStr.toString()));
// 重置,准备保存下一个字符
curStr = new StringBuffer();
} else if (ch == ']') {
// 字符先出栈
StringBuffer prev = stack.removeFirst();
// 数字再出栈
int times = Integer.parseInt(String.valueOf(stack.removeFirst()));
// 将 curStr 重复 times - 1 次
curStr.append(String.valueOf(curStr).repeat(Math.max(0, times - 1)));
// curStr 重置为 prev + 重复后的 curStr
curStr = prev.append(curStr);
} else {
curStr.append(ch);
}
}
return curStr.toString();
}
}