题目链接
思路:
使用栈来求解
准备两个栈,分别存储“[” 前面的数字 和 “[”与“]”之间的字符串。从头开始遍历,遇到数字压入数字栈中,遇到字符串压入字符串栈中,遇到“]”时,弹出一个数字弹出一个字符串,进行拼接之后再次压入字符串栈中,最终全部出栈后拼接得到结果。
这样做是为了求解所给字符串中最内部的“[”与“]”之间包含的字符串,从最内层一层一层向外进行瓦解整个字符串
对于字符串"3[a2[bc]]",从头开始遍历,
首先将3入numStack,遇到“[”,将数字前面的字符串“a”压入strStack中
3[a2[bc]]
numStack 3
strStack a
接下来,遇到数字2,将数字2压入numStack中,遇到“[”,将bc组成一个新的字符串压入strStack中
3[a2[bc]]
numStack 3 2
strStack a bc
接下来,遇到一个“]”,将bc和2弹出,并对bc进行拼接2次,拼接完成之后,将结果与当前栈顶字符串进行合并,并压入栈中
3[a2[bc]]
numStack 3
strStack abcbc
最后,遇到“]”,将3和abcbc弹出,拼接得到结果
3[a2[bc]]
numStack
strStack
结果:abcbcabcbcabcbc
public String decodeString(String s) {
if (s == null || s.length() == 0) {
return "";
}
// 存放数字的栈
Deque<Integer> numStack = new ArrayDeque<>();
// 存放字符串的栈
Deque<StringBuilder> strStack = new ArrayDeque<>();
int num = 0;
// 当前字符串
StringBuilder curRes = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
// 当前字符
char curStr = s.charAt(i);
// 如果当前字符是数字,则需要进行转换
if (Character.isDigit(curStr)) {
num = num * 10 + (curStr - '0');
} else if (curStr == '[') { // 当前字符是左括号
// 将当前字符串结果压入栈中
strStack.push(curRes);
// 重新创建一个空的,用于存放"["后面的字符串结果
curRes = new StringBuilder();
// 将当前"["前面的数字压入栈中
numStack.push(num);
// 数字归0
num = 0;
} else if (curStr == ']') { // 当前字符是右括号
// 数字栈栈顶元素弹出
int count = numStack.pop();
// 字符串栈栈顶元素弹出
StringBuilder cur = strStack.pop();
// 将当前结果与栈顶元素进行拼接
while (count-- > 0) {
cur.append(curRes.toString());
}
// 拼接之后的结果也就是上一层"[]"内部的拼接结果
curRes = cur;
} else {
curRes.append(curStr);
}
}
return curRes.toString();
}
代码参考:https://leetcode-cn.com/problems/decode-string/comments/17225