质量很高的一道题,思考起来不难,实现起来有很多细节。
肯定是要递归做的,将[]里的[]全部消掉,然后再根据外面的乘数添加到答案中。容易出错的地方是面对多个“]”的时候。
import java.util.Deque;
import java.util.LinkedList;
class Solution {
Deque<Integer> stack = new LinkedList<>();
String s;
int len;
int fin;
public String decodeString(String s) {
fin = 0;
this.s = s;
len = s.length();
StringBuilder ans = new StringBuilder();
while (fin != len) {
ans.append(dfs());
}
return ans.toString();
}
StringBuilder dfs() {
StringBuilder sb = new StringBuilder();
for (fin = getNum(); fin < len && s.charAt(fin) != ']';) {
if (isNumber(fin)) {
sb.append(dfs());
} else {
sb.append(s.charAt(fin));
fin++;
}
}
if(fin < len && s.charAt(fin) == ']') {
fin++;
}
int cnt = stack.pop();
StringBuilder temp = new StringBuilder(sb);
for (int i = 0; i < cnt - 1; i++) {
sb.append(temp);
}
return sb;
}
// 将乘数压入栈,返回第一个字母的下标
int getNum() {
int num = 1;
if (isNumber(fin)) {
num = s.charAt(fin++) - '0';
while (isNumber(fin)) {
num = num * 10 + s.charAt(fin++) - '0';
}
fin++;
}
stack.push(num);
return fin;
}
boolean isNumber(int index) {
return s.charAt(index) >= '0' && s.charAt(index) <= '9';
}
public static void main(String[] args) {
new Solution().decodeString("abc3[cd]xyz");
}
}