class Solution {
int ptr = 0;
// 栈
// 对于数字、字符串和左括号将其压入栈中
// 遇到右括号时,将相邻的左括号和字符串数字都弹出
// 并将解码后的字符串在压入栈中
// 定义一个全局变量用来遍历字符串
// 使用了StringBuffer的insert方法 StringBuffer insert(int offset, String str) 在指定位置插入字符串
public String decodeString(String s) {
Stack<String> stack = new Stack<>();
while (ptr < s.length()) {
char c = s.charAt(ptr);
if (Character.isDigit(c)) { //数字
String digits = getDigits(s);
stack.push(digits);
} else if (Character.isLetter(c) || c == '[') {
stack.push(String.valueOf(c));
ptr++;
} else { // 右括号
StringBuffer sb = new StringBuffer();
while (!stack.peek().equals("[")) {
sb.insert(0, stack.pop());
}
String str = sb.toString(); //
stack.pop(); // 删除左括号
StringBuffer tmp = new StringBuffer();
int repeat = Integer.parseInt(stack.pop());
for (int j = 0; j < repeat; j++) {
tmp.append(str);
}
stack.push(tmp.toString());
ptr++;
}
}
StringBuffer sb = new StringBuffer();
while (!stack.isEmpty()) {
sb.insert(0, stack.pop());
}
return sb.toString();
}
public String getDigits(String s) { // 获得数字
StringBuffer sb = new StringBuffer();
while (Character.isDigit(s.charAt(ptr)) && ptr < s.length()) {
sb.append(s.charAt(ptr++));
}
return sb.toString();
}
}