题目描述
思路
- 关键在于,可能有
【】
的嵌套,所以用栈来逐对消除【】
。由于题目保证输入的正确性,所以每遇到一个】
说明前面一定有对应的【
。 - 遍历字符串s,逐个添加char,当遇到
】
时,停止添加,逐个弹栈到【
,以把【】
内的字符展开,并且追加k次。 - 重复次数
k
的确定:【
前的不为char的字符必为数字,把他们*10累加
代码
代码用sb来解决reverse,也可以用栈来reverse,比较麻烦。
class Solution {
public String decodeString(String s) {
Stack<Character> stack = new Stack<>();
StringBuffer res = new StringBuffer();//用sb是因为他有reverse()这个方法,方便
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) != ']') {//没遇到],持续入栈
stack.push(s.charAt(i));
} else {//遇到 ],
StringBuffer group = new StringBuffer();
//把[前的字符弹出来,添加到一个sb里
while (stack.peek() != '[') {
group.append(stack.pop());
}
//出栈顺序是反的,这里正过来
group.reverse();
//把刚才那个【弹了
stack.pop();
//此时stack顶元素为数字,可能是一位,也可能是多位,所以求次数不能只pop一次
int times = 0;
int m = 1;
//计算重复几次
while (!stack.isEmpty() && Character.isDigit(stack.peek())) {
int tmp = stack.pop() - '0';
times += tmp * m;
m *= 10;
}
//把【】内的字符整体追加times次到栈中
for (int j = 0; j < times; j++) {
for (int k = 0; k < group.length(); k++) {
stack.push(group.charAt(k));
}
}
}
}
//到这里,stack中已经没【】和数字了
while (!stack.isEmpty()) {
res.append(stack.pop());
}
return res.reverse().toString();
}
}
class Solution {
public String decodeString(String s) {
int times = 0;
for (char c : s.toCharArray()) {
if (Character.isDigit(c)) {
times = times * 10 + (c - '0');
} else if (Character.isLetter(c)) {
curStr += c;
} else if (c == '[') {
strStack.push(curStr);
numStack.push(times);
curStr = "";
times = 0;
} else if (c == ']') {
String prevStr = strStack.pop();
int t = numStack.pop();
for (int i = 0; i < t; i++) {
prevStr += curStr;
}
curStr = prevStr;
}
}
return curStr;
}
}