题目描述
给定一个经过编码的字符串,返回它解码后的字符串。
编码规则为: k[encoded_string],表示其中方括号内部的 encoded_string 正好重复 k 次。注意 k 保证为正整数。
你可以认为输入字符串总是有效的;输入字符串中没有额外的空格,且输入的方括号总是符合格式要求的。
此外,你可以认为原始数据不包含数字,所有的数字只表示重复的次数 k ,例如不会出现像 3a 或 2[4] 的输入。
示例:
输入:s = “3[a2[c]]”
输出:”accaccacc”
题目分析
使用 StringBuilder 存储数据,枚举字符,每次遇到 ] 就展开一次。
Java
public String decodeString(String s) {
StringBuilder ans = new StringBuilder();
for (int i = 0; i < s.length(); i++) {
if (s.charAt(i) == ']') {
StringBuilder temp = new StringBuilder();
int num = 0;
int numLength = 0;
while (true) {
char ch = ans.isEmpty() ? '-' : ans.charAt(ans.length() - 1);
if (ch <= '9' && ch >= '0') {
// 读取数字
num += (int) (Math.pow(10, numLength++) * (ch - '0'));
} else if (num > 0) {
// 数字读取完毕
while (num-- > 0) {
ans.append(temp);
}
break;
} else if (ch != '[') {
temp.insert(0, ch);
}
ans.deleteCharAt(ans.length() - 1);
}
} else {
ans.append(s.charAt(i));
}
}
return ans.toString();
}
Kotlin
fun decodeString(s: String): String {
val ans = StringBuilder()
for (c in s) {
if (c != ']') {
ans.append(c)
} else {
val temp = StringBuilder()
var num = 0
var numLength = 0
while (true) {
val p = if (ans.isEmpty()) '-' else ans.last()
if (p in '0'..'9') {
num += 10.0.pow(numLength++).toInt() * (p - '0')
} else if (num > 0) {
while (num-- > 0) {
ans.append(temp)
}
break;
} else if (p != '[') {
temp.insert(0, p);
}
ans.deleteCharAt(ans.length - 1)
}
}
}
return ans.toString()
}