一、辅助栈解法:
思路和判断括号有效的差不多,只是在这个题目里需要分解出子问题,不断将子问题的解压入栈中
1、遇到数字就乘10构造数字
2、遇到左括号就压栈,在之前将构造好的数字压栈,然后数字num清零
3、一直到遇到右括号开始出栈拼字符串
4、最后栈里保存的所有字符串拼起来就是最终结果
public String decodeString(String s) {
Stack<String> stack = new Stack();
char[] chars = s.toCharArray();
int num = 0;
for (int i = 0; i < chars.length; i++){
char c = chars[i];
if (c >= '0' && c <= '9'){
num = num * 10 + Integer.valueOf(c - 48);
continue;
}
if (c == '['){
stack.push(String.valueOf(num));
stack.push(String.valueOf(c));
num = 0;
continue;
}
if (c != ']'){
stack.push(String.valueOf(c));
continue;
}
StringBuilder sb = new StringBuilder();
String str = stack.pop();
while (!str.equals("[")){
sb.insert(0,str);
str = stack.pop();
}
int count = Integer.parseInt(stack.pop()) - 1;
String part = sb.toString();
while (count > 0){
sb.append(part);
count --;
}
stack.push(sb.toString());
}
StringBuilder builder = new StringBuilder();
while (!stack.isEmpty()){
builder.insert(0,stack.pop());
}
return builder.toString();
}
二、递归解法
String src;
int ptr;
public String decodeString(String s) {
src = s;
ptr = 0;
return getString();
}
public String getString() {
if (ptr == src.length() || src.charAt(ptr) == ']') {
// String -> EPS
return "";
}
char cur = src.charAt(ptr);
int repTime = 1;
String ret = "";
if (Character.isDigit(cur)) {
// String -> Digits [ String ] String
// 解析 Digits
repTime = getDigits();
// 过滤左括号
++ptr;
// 解析 String
String str = getString();
// 过滤右括号
++ptr;
// 构造字符串
while (repTime-- > 0) {
ret += str;
}
} else if (Character.isLetter(cur)) {
// String -> Char String
// 解析 Char
ret = String.valueOf(src.charAt(ptr++));
}
return ret + getString();
}
public int getDigits() {
int ret = 0;
while (ptr < src.length() && Character.isDigit(src.charAt(ptr))) {
ret = ret * 10 + src.charAt(ptr++) - '0';
}
return ret;
}