这道题我参考了下面的代码
https://leetcode.com/problems/decode-string/discuss/87534/Simple-Java-Solution-using-Stack
感觉他这个代码写的很漂亮。
需要用到的知识点主要是stack.
Stack这个要弄熟, 这个也是一个很经典的应用。 很像计算器那个stack。
这里也是建两个stack, 一个存之前的结果,一个存repeat的数字。遇到数字就把数字压入栈中。
遇到[ 就把之前的res压到另外一个栈中同时把当前的 res 重置为空。
遇到 ]就把之前的数字pop出来,之前的res也pop也来,把当前的res 乘以倍数接到之前的res的后面。
这个栈的套路一定要很熟。
这题要反复写几遍。
还有我之前判断一个字符是不是数字,一直用 char <= '9' && char >= '0' ,这个太傻了, 要学会使用如下
Character.isDigit(char)
Character.isLetter(char)
Character.isLowerCase(char)
Character.isUpperCase(char)
还有一个值得学习的地方是你看他对数字的处理,以前我一直是先找齐所有数字再用Integer.parseInt。
他这个方法感觉更骚一筹。我也在别处见过,但一直没用过。
public String decodeString(String s) {
Deque<String> resDeque = new LinkedList<>();
Deque<Integer> numDeque = new ArrayDeque<>();
int pt = 0;
String res = "";
while (pt < s.length()) {
char ch = s.charAt(pt);
if (Character.isDigit(ch)) {
int num = ch - '0';
while (pt + 1 < s.length() && Character.isDigit(s.charAt(pt + 1))) {
pt++;
num *= 10;
num += s.charAt(pt) - '0';
}
numDeque.push(num);
} else if (ch == '[') {
resDeque.push(res);
res = "";
} else if (ch == ']') {
StringBuilder sb = new StringBuilder(resDeque.pop());
int repeat = numDeque.pop();
for (int i = 0; i < repeat; i++) sb.append(res);
res = sb.toString();
} else {
res += s.charAt(pt);
}
pt++;
}
return res;
}